修改现有的PowerShell脚本以使用并行处理

时间:2017-06-26 15:19:57

标签: powershell parallel-processing powershell-v4.0

我可以使用一些帮助将并行处理代码添加到此脚本中。我想我只是没有充分了解powershell还没有理解我添加必要代码的位置和内容....我想弄清楚但是灯泡还没有......: - )

Start-Transcript C:\temp\agent.log -IncludeInvocationHeader
$computers = gc "C:\temp\list.txt"
$source = "\\pathtodfsrootstore"
$dest = "c$\windows\temp\test2533212"

foreach ($computer in $computers) {
    foreach (if (Test-Connection -Cn $computer -count 1 -quiet) {
        Copy-Item -Force $source -Destination    \\$computer\$dest -Recurse
        #psexec.exe \\$computer cmd /c "c:\windows\temp\testv2533212\test.bat"
    } else {
        Write-output "$computer is not online"
    }
}
Stop-Transcript

2 个答案:

答案 0 :(得分:1)

我认为你可以这样做:

Start-Transcript C:\temp\agent.log -IncludeInvocationHeader

$Computers = Get-Content "C:\temp\list.txt"
$Source = "\\pathtodfsrootstore"
$Dest = "c$\windows\temp\test2533212"

$TestComputers = Test-Connection -Count 1 -AsJob $Computers
$TestResults = $TestComputers | Wait-Job | Receive-Job

$AliveComputers = ($TestResults | Where {$_.StatusCode -eq 0}).Address

Invoke-Command -ComputerName $AliveComputers -ScriptBlock {
    Copy-Item -Force $source -Destination c:\windows\temp\test2533212 -Recurse 
    & "c:\windows\temp\testv2533212\test.bat"
}

Stop-Transcript

这是一个两阶段的方法,我们使用Test-Connection的-AsJob开关对所有计算机进行并行测试以找出哪些是活着的,然后使用此结果来做另一个并行工作。

作业中的路径已经更改,因为它们将在远程计算机上运行,​​因此可以引用本地路径。

我还没有对此进行过测试,所以可能需要进行一些调整。您也可以在开头忽略Test-Connection部分,只允许在无法访问机器的情况下作业失败。

使用上述解决方案,如果您想知道哪些机器无法访问,您可以这样做:

$DeadComputers = ($TestResults | Where {$_.StatusCode -ne 0}).Address

答案 1 :(得分:0)

对于并行处理,你可能想探索powershell工作流程,它有foreach-parellel组件,它将像魅力一样处理并行处理

Workflow basics

并行片段如下

<desc>description 0</desc>
<desc>another &#xD;description 1</desc>

在上面的示例中,每个并行运行,在PowerShell工作流程中存在限制,也就是说,我们无法进行写入输出,当您尝试解决问题时,您可能想要记录它

只是尝试在代码之上进行更改,您可能需要花费大约15分钟,尤其是您的解决方案,但是要在这些方面进行更改

workflow Start-Something {

      foreach -Parallel($i in 0..1000)
      {
      $i
      }

      }

Start-Something