我有这个powershell代码,我想开始工作。它目前不评估$ agent变量。
foreach($agent in $agentcomputers){
Write-Output 'Starting agent on '$agent
#psexc to start the agent
Start-Job -ScriptBlock {& psexec $agent c:\grinder\examples\startAgent.cmd}
}
这看起来类似于我的问题,除了我没有调用外部PowerShell脚本。
https://sqlblog.org/2011/01/29/powershell-start-job-scriptblock-sad-panda-face
我尝试添加它,使用$ args [0]代理$ agent并添加-ArgumentList参数,但这不起作用。
感谢您提供的任何帮助。
编辑/回信...
这是$ agentcomputers,只是一个计算机名称列表。每个都在它自己的路线上。
$agentcomputers = Get-Content c:\grinder-dist\agent-computers.txt
我也试过这个 - 而$ args [0]不评估
Start-Job -ScriptBlock {& psexec $args[0] c:\grinder\examples\startAgent.cmd} -ArgumentList @($agent)
答案 0 :(得分:9)
我将采用3种不同的方式。 首先,所有对齐和漂亮。
$agents = Get-Content c:\grinder-dist\agent-computers.txt
$jobs = {
Param($agent)
write-host "Starting agent on" $agent
& psexec \\$agent c:\grinder\examples\startAgent.cmd
}
foreach($agent in $agents) {
Start-Job -ScriptBlock $jobs -argumentlist $agent | Out-Null
}
Get-Job | Wait-Job | Receive-Job
或者你可以把它全部放在一行而不创建任何变量。
(Get-Content c:\grinder-dist\agent-computers.txt) | %{ Start-Job -ScriptBlock { param($_) write-host "Starting agent on" $_; & psexec \\$_ c:\grinder\examples\startAgent.cmd } -argumentlist $_ | Out-Null }
Get-Job | Wait-Job | Receive-Job
在最后一个示例中,您可以通过这种方式管理并发运行的线程数。
$MaxThreads = 5
$agents = Get-Content c:\grinder-dist\agent-computers.txt
$jobs = {
Param($agent)
write-host "Starting agent on" $agent
& psexec \\$agent c:\grinder\examples\startAgent.cmd
}
foreach($agent in $agents) {
Start-Job -ScriptBlock $jobs -argumentlist $agent | Out-Null
While($(Get-Job -State 'Running').Count -ge $MaxThreads) {
sleep 10
}
Get-Job | Wait-Job | Receive-Job
}
答案 1 :(得分:4)
这是解决方案。正如Andy所说,我需要使用带有-ArgumentList参数的$ args数组。这个其他主题很有帮助:Powershell: passing parameters to a job
foreach($agent in $agentcomputers){
$agentslash = "\\"+$agent
$args = ($agentslash,"c:\grinder\examples\startAgent.cmd")
Write-Output 'Starting agent on '$agent
#psexc to start the agent
$ScriptBlock = {& 'psexec' @args }
Start-Job -ScriptBlock $ScriptBlock -ArgumentList $args
}