Powershell 开始作业中的变量不会得到计算

Powershell 开始作业中的变量不会得到计算,powershell,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} } 与我的问题类似,只是我没有调用外部Powers

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

我尝试将其添加到中,为
$agent
使用
$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)

这是解决办法。正如Andy所说,我需要使用带有-ArgumentList参数的$args数组。另一个线程很有帮助:


这里有三种不同的方法。 首先,所有这些都排列整齐、漂亮

$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
} 

您需要使用ArgumentList参数,或者使用
$args
数组或param块。您还可以更改$agent变量的范围,我认为:$global:agent.@DavidBrabant全局范围不起作用,因为它是在单独的PowerShell.exe进程中执行的。数据被序列化并传递到后台进程。如何确保未计算$agent?如果您使用测试写入输出$agent更改psexec,您会有相同的行为吗?没有错误输出?根据psexec的
“\\$args[0]”
,您可能需要反斜杠。确保命令在没有后台作业的情况下自行运行。
$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
}