使用局部变量的for循环中的语法



我的许多脚本都在使用PSsession,经常检查几个远程电脑上的可用共享。PS远程处理非常棒。以下是简单的工作代码片段:

if (Invoke-Command -Session $PSess -ScriptBlock {Get-SMBShare -Name $using:shareName_1 -ea 0}) {
$mapPS_1=0
write-Host "available: $shareName_1"
} else {
$mapPS_1=1
write-Host "NOT available: $shareName_1"
}

我不想多次重复此代码(根据列表中的示例,仅使用不同的shareNames变量(,而是想创建一个仅包含该代码的for循环(可能(。以下是需要检查的股票列表:

$shareName_1='TC-MEDIA-SYSTEM'
$shareName_2='TC-MEDIA-DATA1'
$shareName_3='V-15TB_01'
$shareName_4='W-LL-503DD'
$shareName_5='X-TL-503AA'
$shareName_6='Y-LL-503BB'
$shareName_7='Z-LL-503CC'
$shareName_8='DUMPSTER_01'
$shareName_9='BKUP-NAS-01'
$shareName_10='TC-DUMPSTER_02'

从代码片段中可以看出,根据结果输出,一个局部变量$mapPS会被操作。

如上所示,所有这些都很好。我面临的问题是找到正确的语法,以便在for循环中运行

我认为变量$using:shareName_$i是令人不安的因素。

这就是我目前所掌握的。不幸的是,没有结果。

for ($i = 1; $i -lt 11; $i++) {
if (Invoke-Command -Session $PSess -ScriptBlock {Get-SMBShare -Name $using:(Get-Variable -Name shareName_$i).Value} -ea 0) {
Set-Variable -Name mapPS_$i value 0
write-Host "available: $shareName_$i"
} else {
Set-Variable -Name mapPS_$i value 1
write-Host "NOT available: $shareName_$i"
}
}

我确信Powershell对此有一个解决方案——我只是不知道。如有任何提示,我们将不胜感激。

通常,考虑将共享名称存储在数组中,而不是存储在单个变量(例如$shareNames ='TC-MEDIA-SYSTEM', 'TC-MEDIA-DATA1', ...(中,这样您就可以通过索引(例如$shareNames[0](引用它们,而不必通过Get-Variablecmdlet使用变量间接


一个简单的解决方案是创建一个aux。循环中的本地变量,您的远程脚本可以通过$using:作用域(不支持命令或表达式(引用:

foreach ($i in 1..10) {
$shareName = Get-Variable -ValueOnly "$shareName_$i"
if (Invoke-Command -Session $PSess -ScriptBlock { Get-SMBShare -Name $using:shareName } -ea 0) {
Set-Variable -Name mapPS_$i value 0
write-Host "available: $shareName_$i"
}
else {
Set-Variable -Name mapPS_$i value 1
write-Host "NOT available: $shareName_$i"
}
}

最新更新