我试图关闭远程2008 R2文件服务器上的某些打开的文件,使用以下行:
$FileList = Invoke-Command -Scriptblock { openfiles.exe /query /S fileserver01 /fo csv | where {$_.contains("sampletext")} }
foreach ($f in $FileList) {
$fid = $f.split(',')[0]
$fid = $fid -replace '"'
Invoke-Command -ComputerName fileserver01 -ScriptBlock { net file $fid /close }
}
如果我输入它,我可以让它工作,但是当我把它扔到脚本中时,它不会关闭文件。
我已经验证了$FileList
变量被填充($fid
确实得到了文件id),所以我不认为有一个执行策略阻止了我。我不确定是什么
我认为这是因为你的$fid变量只存在于你的本地会话。
如果你使用的是powershell 3,你可以使用"using",例如:
Invoke-Command -ComputerName fileserver01 -ScriptBlock { net file $using:fid /close }
在powershell 2中,你可以这样写:
如何使用Invoke-Command传递命名参数?
问题是脚本块中的$fid
变量与foreach
循环中的$fid
变量不同。您需要将其作为参数传递,如下所示:
foreach ($f in $FileList) {
$fid = $f.split(',')[0]
$fid = $fid -replace '"'
Invoke-Command -ComputerName fileserver01 -ArgumentList $fid -ScriptBlock {
param ($fid)
net file $fid /close
}
}
每当我做这样的事情时,我通常在脚本块中选择不同的变量名,以避免混淆。-ArgumentList
参数中的参数与param
节中的变量一一匹配,因此在本例中,$fid映射到$fileId:
foreach ($f in $FileList) {
$fid = $f.split(',')[0]
$fid = $fid -replace '"'
Invoke-Command -ComputerName fileserver01 -ArgumentList $fid -ScriptBlock {
param ($fileId)
net file $fileId /close
}
}