在远程计算机上运行调用命令时出现内存不足错误


$Machines = Get-Content Machines.txt
    foreach($Machine in $Machines)
      {
        $session = New-PSSession -ComputerName $Machine -Credential $creds 
        Invoke-Command -ComputerName $Machine -ScriptBlock {
           #Download 
           & 'wget' 'http://software/software.7z'
           #Extract
           & '7z' 'x' 'C:software.7z'  '-r' '-y'
           $cleanscript = "Remove-Item C:software.7z  -Force"
           $cleanscript  | Out-File C:RemoveZip.ps1 -Encoding ascii
           & "C:RemoveZip.ps1"
           $script = "CALL C:softwaresetup.exe"
           $script  | Out-File C:software.cmd -Encoding ascii
           & "C:software.cmd"
       } -Credential $creds 
      }    

运行 30 台计算机后,PowerShell 和运行脚本的计算机将耗尽内存。如何避免这种情况?

shell 会占用正在运行的计算机上的所有 16 GB 内存。诸如超出外壳内存之类的解决方案可能不起作用,例如,使用 Powershell Invoke-Command

如果要使用 PowerShell

,请编写 PowerShell。

$Machines = Get-Content -Path Machines.txt
ForEach ($Machine in $Machines)
{
    Invoke-Command -ComputerName $Machine -Credential $creds -ScriptBlock {
        #Download 
        Invoke-WebRequest -Uri 'http://software/software.7z' -OutFile 'C:software.7z'
        #Extract
        Start-Process -FilePath '7z.exe' -ArgumentList 'x','C:software.7z','-r','-y' -NoNewWindow -Wait
        Remove-Item -Path C:software.7z -Force
        Start-Process -FilePath 'C:softwaresetup.exe'
    }  
}

我怀疑所有远程文件写入和外部调用都可能导致问题(此外,如果您使用的是 v5+,请使用 *Archive cmdlet over 7z(。 此外,您正在生成会话,但从未使用它。

我在脚本执行期间监视了PowerShell的内存空间。运行 wget 命令时,内存立即开始增加,进度输出填充控制台缓冲区并消耗 PowerShell 进程内存。我用了

        & 'wget' '-q' 'http://software/software.7z' 

这保持了内存使用量稳定,并大大加快了执行速度

在 Linux 中隐藏 wget 输出

当然,如果可以通过PSSession运行PowerShell 5.1复制文件来代替

不确定内存问题,但您可以尝试一些方法。

  1. 您的 New-PsSession 不执行任何操作,因此要么摆脱它,要么使用它。 然后,您可以在同一会话上多次执行调用命令,而不是发送大块
  2. 也许与 -nowait 并行运行它们,然后等待对象作业也有助于内存问题。
  3. 不要 foreach,使用管道:) $machines | %{ invoke-command -machine $_...

最新更新