在远程计算机上运行Invoke-Command时出现OutOfMemory错误

时间:2018-01-09 20:17:18

标签: powershell memory memory-management memory-leaks out-of-memory

$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:\software\setup.exe"
           $script  | Out-File C:\software.cmd -Encoding ascii
           & "C:\software.cmd"
       } -Credential $creds 
      }    

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

shell在运行的计算机上占用所有16​​ GB的内存。像超出外壳的内存的解决方案可能不起作用,例如OutOfMemory Exception on remote execution using Powershell Invoke-Command

3 个答案:

答案 0 :(得分:1)

如果要使用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:\software\setup.exe'
    }  
}

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

答案 1 :(得分:1)

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

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

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

Hide wget output in Linux

当然,如果可以使用通过PSSession运行PowerShell 5.1 Copy-Files

答案 2 :(得分:0)

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

  1. 你的New-PsSession没有做任何事情,所以要么摆脱它,要么使用它。那么你可以在同一个会话上多次调用invoke-command,而不是发送大块
  2. 也许与-nowait并行运行它们,然后等待对象也会有助于记忆问题。
  3. 不要foreach,使用管道:) $ machines | %{invoke-command -machine $ _...