使用 -ArgumentList 和 Start-Job 传递参数不起作用。代码有什么问题?
Passing in Parameters With -ArgumentList and Start-Job not Working. What's wrong with the code?
我目前在尝试对虚拟机(特别是 VMWare)进行多线程部署时遇到问题,我正在使用以下代码进行尝试:
connect-viserver vcenter
for($i=251; $i -le 261; $i++) {
Start-Job {Param([string]$num) New-vm -ResourcePool Storage-POCs -Name "virtual-machine-$num" -vm "newvm" -Datastore MyDataStore} -ArgumentList $i
}
这是我目前从这段代码在终端中得到的输出:
HasMoreData : True
StatusMessage :
Location : localhost
Command : Param([string]$num)
New-vm -ResourcePool Storage-POCs -Name "virtual-machine-$num" -vm "newvm" -Datastore MyDataStore
JobStateInfo : Running
Finished : System.Threading.ManualResetEvent
InstanceId : 3a6b8f27-c8d8-4386-9e58-6c1dfcfef52c
Id : 419
Name : Job419
ChildJobs : {Job420}
Output : {}
Error : {}
Progress : {}
Verbose : {}
Debug : {}
Warning : {}
State : Running
HasMoreData : True
StatusMessage :
Location : localhost
Command : Param([string]$num)
New-vm -ResourcePool Storage-POCs -Name "virtual-machine-$num" -vm "newvm" -Datastore MyDataStore
JobStateInfo : Running
...
谁能告诉我为什么
$数
没有转换成 $i?
的数字
谢谢,
亚历克斯
因此,该命令实际上按照您的预期执行,只是当您 运行 Get-Job 时,它会向您显示执行的精确命令。这意味着它向我们显示 $num
作为字符串的名称,而不是值。
在执行命令之前,替换实际上并没有发生。
您可以通过将值转储到文本文件中来进行测试,就像这样。
for($i=251; $i -le 261; $i++) {
Start-Job {Param([string]$num) "virtual-machine-$num">>t:\test.txt} -ArgumentList $i
}
现在,当我 运行 找工作 | select -expand 命令,我还是会看到:
Param([string]$num) "virtual-machine-$num">>t:\test.txt
Param([string]$num) "virtual-machine-$num">>t:\test.txt
Param([string]$num) "virtual-machine-$num">>t:\test.txt
Param([string]$num) "virtual-machine-$num">>t:\test.txt
Param([string]$num) "virtual-machine-$num">>t:\test.txt
Param([string]$num) "virtual-machine-$num">>t:\test.txt
然而,当我阅读该文件时,我发现它实际上做了我想要的:
virtual-machine-251
virtual-machine-252
virtual-machine-253
virtual-machine-254
virtual-machine-255
virtual-machine-256
virtual-machine-257
virtual-machine-258
virtual-machine-259
virtual-machine-260
virtual-machine-261
所以,基本上这确实有效,只是看起来不像。
我目前在尝试对虚拟机(特别是 VMWare)进行多线程部署时遇到问题,我正在使用以下代码进行尝试:
connect-viserver vcenter
for($i=251; $i -le 261; $i++) {
Start-Job {Param([string]$num) New-vm -ResourcePool Storage-POCs -Name "virtual-machine-$num" -vm "newvm" -Datastore MyDataStore} -ArgumentList $i
}
这是我目前从这段代码在终端中得到的输出:
HasMoreData : True
StatusMessage :
Location : localhost
Command : Param([string]$num)
New-vm -ResourcePool Storage-POCs -Name "virtual-machine-$num" -vm "newvm" -Datastore MyDataStore
JobStateInfo : Running
Finished : System.Threading.ManualResetEvent
InstanceId : 3a6b8f27-c8d8-4386-9e58-6c1dfcfef52c
Id : 419
Name : Job419
ChildJobs : {Job420}
Output : {}
Error : {}
Progress : {}
Verbose : {}
Debug : {}
Warning : {}
State : Running
HasMoreData : True
StatusMessage :
Location : localhost
Command : Param([string]$num)
New-vm -ResourcePool Storage-POCs -Name "virtual-machine-$num" -vm "newvm" -Datastore MyDataStore
JobStateInfo : Running
...
谁能告诉我为什么 $数 没有转换成 $i?
的数字谢谢, 亚历克斯
因此,该命令实际上按照您的预期执行,只是当您 运行 Get-Job 时,它会向您显示执行的精确命令。这意味着它向我们显示 $num
作为字符串的名称,而不是值。
在执行命令之前,替换实际上并没有发生。
您可以通过将值转储到文本文件中来进行测试,就像这样。
for($i=251; $i -le 261; $i++) {
Start-Job {Param([string]$num) "virtual-machine-$num">>t:\test.txt} -ArgumentList $i
}
现在,当我 运行 找工作 | select -expand 命令,我还是会看到:
Param([string]$num) "virtual-machine-$num">>t:\test.txt
Param([string]$num) "virtual-machine-$num">>t:\test.txt
Param([string]$num) "virtual-machine-$num">>t:\test.txt
Param([string]$num) "virtual-machine-$num">>t:\test.txt
Param([string]$num) "virtual-machine-$num">>t:\test.txt
Param([string]$num) "virtual-machine-$num">>t:\test.txt
然而,当我阅读该文件时,我发现它实际上做了我想要的:
virtual-machine-251
virtual-machine-252
virtual-machine-253
virtual-machine-254
virtual-machine-255
virtual-machine-256
virtual-machine-257
virtual-machine-258
virtual-machine-259
virtual-machine-260
virtual-machine-261
所以,基本上这确实有效,只是看起来不像。