Игра с объектом в Powershell Workflow

Я пытаюсь узнать, как использовать Workflow в Powershell и как обойти ограничения, накладываемые на переменные (и объекты в моем случае). Но я сталкиваюсь с проблемой, когда пытаюсь изменить объект области рабочего процесса из действия InlineScript.

Что делает код:

  1. Задавать $VMSettings с содержанием файла Json. Этот файл содержит настройки для виртуальной машины, которые я хочу создать в Hyper-V;
  2. Задавать $VMHostSettings с параметрами хоста Hyper-V;
  3. Начать Foreach -Parallel Цикл для работы на каждой виртуальной машине параллельно:
    1. В последовательности я пишу имя и путь к виртуальной машине из области Workflow;
    2. В InlineScript активность, я пишу название ВМ с $using как тест с тем, как работают области видимости;
    3. Если $VM.path пусто, я начинаю новый InlineScript деятельность в которой я:
      1. Установите новую переменную с содержанием $VM переменная из области рабочего процесса;
      2. Изменить path свойство этой новой переменной и отобразить ее;
    4. Я отображаю область рабочего процесса $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

Любая подсказка о том, что я делаю неправильно?

0 ответов

Другие вопросы по тегам