Start-Job中的变量

时间:2012-04-17 18:01:01

标签: powershell

我有这个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)

2 个答案:

答案 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

}