Я переписал это, чтобы предоставить простой, общий пример.
При запуске цикла я могу создать несколько заданий, используя переменную, таким образом:
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
в этой итерации?