我可以使用一些帮助将并行处理代码添加到此脚本中。我想我只是没有充分了解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
答案 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组件,它将像魅力一样处理并行处理
并行片段如下
<desc>description 0</desc>
<desc>another 
description 1</desc>
在上面的示例中,每个并行运行,在PowerShell工作流程中存在限制,也就是说,我们无法进行写入输出,当您尝试解决问题时,您可能想要记录它
只是尝试在代码之上进行更改,您可能需要花费大约15分钟,尤其是您的解决方案,但是要在这些方面进行更改
workflow Start-Something {
foreach -Parallel($i in 0..1000)
{
$i
}
}
Start-Something