Я переписал это, чтобы предоставить простой, общий пример.
При запуске цикла я могу создать несколько заданий, используя переменную, таким образом:
foreach ( $n in 1..10 ) {
start-job { echo $n }
}
Это создает список заданий следующим образом:
Id Name PSJobTypeName State HasMoreData Location Command -- ---- ------------- ----- ----------- -------- ------- 1 Job1 BackgroundJob Running True localhost echo $n 3 Job3 BackgroundJob Running True localhost echo $n 5 Job5 BackgroundJob Running True localhost echo $n 7 Job7 BackgroundJob Running True localhost echo $n 9 Job9 BackgroundJob Running True localhost echo $n 11 Job11 BackgroundJob Running True localhost echo $n 13 Job13 BackgroundJob Running True localhost echo $n 15 Job15 BackgroundJob Running True localhost echo $n 17 Job17 BackgroundJob Running True localhost echo $n 19 Job19 BackgroundJob Running True localhost echo $n
Как я могу сказать значение переменной, используемой в Job1? Переменная указана в команде, но она не раскрывается:
PS C:\Users\James> ( get-job 1) | fl *
State : Running
HasMoreData : True
StatusMessage :
Location : localhost
Command : echo $n
JobStateInfo : Running
Finished : System.Threading.ManualResetEvent
InstanceId : d000978d-9188-4c96-8563-db068c7dc31b
Id : 1
Name : Job1
ChildJobs : {Job2}
PSBeginTime : 11/06/2017 21:43:31
PSEndTime :
PSJobTypeName : BackgroundJob
Output : {}
Error : {}
Progress : {}
Verbose : {}
Debug : {}
Warning : {}
Information : {}
Также команда не расширена в ChildJob:
PS C:\Users\James> (get-job 2) |fl *
State : Completed
StatusMessage :
HasMoreData : True
Location : localhost
Runspace : System.Management.Automation.RemoteRunspace
Debugger : System.Management.Automation.RemotingJobDebugger
IsAsync : True
Command : echo $n
JobStateInfo : Completed
Finished : System.Threading.ManualResetEvent
InstanceId : 39bb0735-eecf-4d61-afa2-3db9d14097a4
Id : 2
Name : Job2
ChildJobs : {}
PSBeginTime : 11/06/2017 21:43:58
PSEndTime : 11/06/2017 21:44:03
PSJobTypeName :
Output : {$null}
Error : {}
Progress : {parent = -1 id = 0 act = Preparing modules for first use. stat = cur = pct = -1 sec = -1 type =
Completed}
Verbose : {}
Debug : {}
Warning : {}
Information : {}
Может кто-нибудь предложить, как я могу получить расширенные переменные из этих заданий?
-------------------------------------------------- ----------------------------
Оригинальный сценарий:
Я выполнил команду в цикле, чтобы удалить снимки из нескольких виртуальных машин:
get-vm | Where-Object -FilterScript { $_.Name -match "TRU-JDF-CMTEST[1-5]"} | ForEach-Object { Get-VMSnapshot -VMName $_.Name | Remove-VMSnapshot -AsJob }
Это создает рабочие места, как пример ниже:
(Get-Job 4)|fl *
State : Failed
StatusMessage :
HasMoreData : True
Location :
Command : get-vm | Where-Object -FilterScript { $_.Name -match "TRU-JDF-CMTEST[1-5]" } | ForEach-Object {
Get-VMSnapshot -VMName $_.Name | Remove-VMSnapshot -AsJob }
JobStateInfo : Failed
Finished : System.Threading.ManualResetEvent
InstanceId : b357f708-59cf-40f1-a07e-a86ddc45985a
Id : 4
Name : Job4
ChildJobs : {}
PSBeginTime : 04/05/2017 10:33:39
PSEndTime : 04/05/2017 10:33:39
PSJobTypeName :
Output : {}
Error : {Object reference not set to an instance of an object.}
Progress : {parent = -1 id = 0 act = Virtual Machine Operation stat = Exception cur = pct = 100 sec = -1 type =
Completed}
Verbose : {}
Debug : {}
Warning : {}
В этом примере мясо команды указано как:
Get-VMSnapshot -VMName $_.Name | Remove-VMSnapshot -AsJob
Как я могу узнать значение $_.Name в этой итерации?
