Start-Job中的变量

Sam*_*Sam 2 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}
}
Run Code Online (Sandbox Code Playgroud)

这看起来类似于我的问题,除了我没有调用外部PowerShell脚本.

https://sqlblog.org/2011/01/29/powershell-start-job-scriptblock-sad-panda-face

我尝试添加它,使用$ args [0] for $ agent并添加-ArgumentList参数,但这不起作用.

感谢您的任何帮助,您可以提供.

编辑/回信......


这是$ agentcomputers,只是一个计算机名称列表.每个都在它自己的线上.

$agentcomputers = Get-Content c:\grinder-dist\agent-computers.txt
Run Code Online (Sandbox Code Playgroud)

我也试过这个 - 而$ args [0]没有评估

Start-Job -ScriptBlock {& psexec $args[0] c:\grinder\examples\startAgent.cmd} -ArgumentList @($agent)
Run Code Online (Sandbox Code Playgroud)

T.C*_*.CK 10

以下是我将采用的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
Run Code Online (Sandbox Code Playgroud)

或者你可以把它全部放在一行而不创建任何变量.

(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
Run Code Online (Sandbox Code Playgroud)

在最后一个示例中,您可以通过这种方式管理并发运行的线程数.

$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
} 
Run Code Online (Sandbox Code Playgroud)