调用命令网文件关闭



我试图关闭远程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
    }
}

相关内容

  • 没有找到相关文章

最新更新