2012-04-17 46 views
2

我有这个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脚本。

http://sqlblog.com/blogs/aaron_bertrand/archive/2011/01/29/powershell-start-job-scriptblock-sad-panda-face.aspx

我想补充说的,使用的$ args [0] $剂和添加-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

'$ agent'中存储了什么? – 2012-04-17 18:05:15

+0

您需要使用ArgumentList参数,或者使用'$ args'数组或param块。 – 2012-04-17 18:06:21

+0

您可能还会更改$ agent变量的范围,我认为:$ global:agent。 – 2012-04-17 18:08:20

回答

4

这里是解决方案。正如Andy所说,我需要使用$ args数组和-ArgumentList参数。这其他线程是有帮助的: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 

} 
7

这里有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 
}