Using Array in Invoke-Command on Remote Machine
I'm trying to run a script that will test if various network drives are mounted to several systems (i.e. \\path\to\share mounts as T:). These are all stored in a CSV file, and each drive letter is separated by a space. I can import each row into a variable and loop through them, but I can't seem to pass them into an Invoke-Command script block.
I've spent some time googling the issue and did find a few suggestions, but I still seem to be having issues getting everything to work. Code is as follows:
$credentials = Get-Credential
$sysdrives = Import-Csv .\systems.csv
$i = 0
while ($i -lt $sysdrives.length) {
$drives = $sysdrives[$i].Drives.split(" ")
$currsystem = $sysdrives[$i].System
Write-Host "Testing $currsystem..."
foreach($drive in $drives) {
Invoke-Command -ComputerName $currsystem -Credential $credentials -ScriptBlock {
$currdrive = $Using:drive
Write-Host "Testing if $currdrive is present..."
if (!(Test-Path $currdrive)) {
Write-Host "$currdrive not present!"
}
else {
Write-Host "$currdrive is mounted"
}
} -ArgumentList $drive
}
$i += 1
}
Example entry from my CSV file:
fqdn.server.name,X: Y: Z:
EDIT: In case someone else stumbles across this post, this is how I was able to solve it:
- I was missing a param() block underneath inside the Invoke-Command ScriptBlock
- I replaced Test-Path with Get-PSDrive. This allowed me to test the drives successfully, despite not being logged into the machine. Your mileage may vary in your own environment, but it worked just fine for me.
I made a few other modifications to clean up the output a bit, but here's the code I'm using:
$credentials = Get-Credential
$sysdrives = Import-Csv .\systems.csv
$i = 0
while ($i -lt $sysdrives.length) {
$drives = $sysdrives[$i].Drives.split(" ")
$currsystem = $sysdrives[$i].System
Write-Host "Testing $currsystem..."
foreach($drive in $drives) {
Invoke-Command -ComputerName $currsystem -Credential $credentials -ScriptBlock {
param($currdrive)
Write-Verbose "Testing if $currdrive is present..."
if (!(Get-PSDrive $currdrive -ErrorAction SilentlyContinue)) {
Write-Host "ERROR: $currdrive is not mounted!!!" -BackgroundColor Black -ForegroundColor Red
}
else {
Write-Verbose "$currdrive is mounted"
}
} -ArgumentList $drive
}
$i += 1
}
8 comments · 75% upvoted · other discussions
Mapped drives are attached to a user profile rather than a system so are you using the same account that has the mapped drives on? If not, but the user who has the mapped drives is logged on then you can query the registry to find what drives are mapped and what letters are used to map them. I'm on mobile so I don't have examples or links but hopefully that will point you in the right direction.