3

我的 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 脚本。

我尝试添加它,使用$args[0]for$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)
4

2 回答 2

11

这里有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
} 
于 2014-01-09T08:18:58.067 回答
4

这是解决方案。正如安迪所说,我需要使用带有 -ArgumentList 参数的 $args 数组。这个其他线程很有帮助: Powershell:将参数传递给作业

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

}
于 2012-04-17T20:16:18.090 回答