invoke-command net file close

时间:2015-05-29 22:04:32

标签: file powershell invoke-command

我正在尝试使用以下行关闭远程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),因此我认为没有执行策略阻止我。我不确定它可能是什么。

2 个答案:

答案 0 :(得分:1)

我认为这是因为您的$ fid变量仅存在于您的本地会话中。

如果您使用的是powershell 3,则可以使用“使用”,例如:

Invoke-Command -ComputerName fileserver01 -ScriptBlock { net file $using:fid /close }

在powershell 2中,您可以使用:

How do I pass named parameters with Invoke-Command?

答案 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
    }
}