我正在尝试使用以下行关闭远程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),因此我认为没有执行策略阻止我。我不确定它可能是什么。
答案 0 :(得分:1)
我认为这是因为您的$ fid变量仅存在于您的本地会话中。
如果您使用的是powershell 3,则可以使用“使用”,例如:
Invoke-Command -ComputerName fileserver01 -ScriptBlock { net file $using:fid /close }
在powershell 2中,您可以使用:
答案 1 :(得分:1)
问题是脚本块中的$fid
变量与$fid
循环中的foreach
变量不同。您需要将其作为参数传递,如下所示:
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
}
}