Powershell 开始作业中的变量不会得到计算
我的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
$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
}