3

$agent私のPowershellコードは変数を評価しません:

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

または、変数を作成せずにすべてを 1 行に入れることもできます。

(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

これが解決策です。Andy が言ったように、-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 に答える