Игра с объектом в Powershell Workflow
Я пытаюсь узнать, как использовать Workflow в Powershell и как обойти ограничения, накладываемые на переменные (и объекты в моем случае). Но я сталкиваюсь с проблемой, когда пытаюсь изменить объект области рабочего процесса из действия InlineScript.
Что делает код:
- Задавать
$VMSettings
с содержанием файла Json. Этот файл содержит настройки для виртуальной машины, которые я хочу создать в Hyper-V; - Задавать
$VMHostSettings
с параметрами хоста Hyper-V; - Начать
Foreach -Parallel
Цикл для работы на каждой виртуальной машине параллельно:- В последовательности я пишу имя и путь к виртуальной машине из области Workflow;
- В
InlineScript
активность, я пишу название ВМ с$using
как тест с тем, как работают области видимости; - Если
$VM.path
пусто, я начинаю новыйInlineScript
деятельность в которой я:- Установите новую переменную с содержанием
$VM
переменная из области рабочего процесса; - Изменить
path
свойство этой новой переменной и отобразить ее;
- Установите новую переменную с содержанием
- Я отображаю область рабочего процесса
$VM.path
еще раз, чтобы увидеть, если что-то изменилось.
Вот код:
Workflow New-VMFromJson {
$VMSettings = Get-Content -Raw -Path $ConfigurationFile | ConvertFrom-Json
$VMHostSettings = Get-VMHost
ForEach -Parallel ($VM In $VMSettings.virtualMachines) {
sequence {
'Name form Workflow: ' + $VM.name
'Path form Workflow: ' + $VM.path
InlineScript {
Write-Host "Name from InlineScript (using): $($using:VM.name)"
}
# If VM path is not set, use default Hyper-V settings instead
If (!$VM.path) {
InlineScript {
$VM = $using:VM
$VM.path = $($using:VMHostSettings.VirtualMachinePath) + 'Virtual Machines'
'Name from Inlinescript: ' + $VM.name
'Path from Inlinescript: ' + $VM.path
}
'Path form Workflow again: ' + $VM.path
}
}
}
Write-Verbose "End of Workflow"
}
New-VMFromJson -Verbose
Пока все хорошо, когда я загружаю рабочий процесс данными, где $VM.path
пуст (так что я могу войти в блок If), и я получаю этот результат:
VERBOSE: 7fc31127-bee1-445f-acaa-275cc5c0c39d:[localhost]:Workflow started !
Name form Workflow: NewVM2
Name form Workflow: NewVM
Path form Workflow:
Path form Workflow:
Name from InlineScript (using): NewVM2
Name from Inlinescript: NewVM2
Path from Inlinescript: C:\Hyper-V\VM\Virtual Machines
Path form Workflow again:
Name from InlineScript (using): NewVM
Name from Inlinescript: NewVM
Path from Inlinescript: C:\Hyper-V\VM\Virtual Machines
Path form Workflow again:
VERBOSE: 7fc31127-bee1-445f-acaa-275cc5c0c39d:[localhost]:End of Workflow
Мы видим, что все работает как надо. InlineScript-модификация области видимости нового $VM
Переменная не влияет на одноименную переменную workflow-scope, и это нормальное поведение.
Теперь, если я хочу изменить переменную workflow-scope из действия InlineScript, у меня возникают некоторые проблемы. Я следил за информацией на этой странице Microsoft Doc, где они показывают этот фрагмент кода:
workflow Test-Workflow
{
$a = 3
# Changes to an InlineScript variable do not affect
# the workflow variable.
InlineScript {$a = $using:a+1; "Inline A = $a"}
"Workflow A = $a"
# To change the value in workflow scope, return the new value.
$a = InlineScript {$a = $Using:a+1; $a}
"Workflow New A = $a"
}
PS C:\> Test-Workflow
Inline A = 4
Workflow A = 3
Workflow New A = 4
Поэтому я изменил свой собственный код, чтобы сделать это вместо этого:
If (!$VM.path) {
$VM = InlineScript {
$VM = $using:VM
$VM.path = $($using:VMHostSettings.VirtualMachinePath) + 'Virtual Machines'
Return $VM
}
}
Я устанавливаю область действия рабочего процесса $VM
переменная с содержанием InlineScript
деятельность. В этом упражнении я все еще копирую содержимое переменной области рабочего процесса в область InlineScript-scope, внося изменения в переменную области InlineScript, а затем возвращаю ее.
При этом я получаю следующую ошибку:Property 'path' cannot be found on this object; make sure it exists and is settable.
Эта ошибка появляется в строке, соответствующей $VM = InlineScript {
, Я должен также упомянуть, что я получаю этот результат после запуска скрипта. Например, если область действия $VM
переменная была удалена вместо набора:
VERBOSE: 7fc31127-bee1-445f-acaa-275cc5c0c39d:[localhost]:Workflow started !
Name form Workflow:
Name form Workflow:
Path form Workflow:
Path form Workflow:
Name from InlineScript (using):
Name from Inlinescript:
Path from Inlinescript:
Path form Workflow again:
Name from InlineScript (using):
Name from Inlinescript:
Path from Inlinescript:
Path form Workflow again:
VERBOSE: 7fc31127-bee1-445f-acaa-275cc5c0c39d:[localhost]:End of Workflow
Любая подсказка о том, что я делаю неправильно?