2

我正在尝试学习如何在 Powershell 中使用 Workflow 以及如何绕过应用于变量(和我的例子中的对象)的限制。但是当我尝试从 InlineScript 活动修改工作流范围对象时,我遇到了一个问题。

代码的作用:

  1. $VMSettings使用 Json 文件内容设置。此文件包含我想在 Hyper-V 中创建的 VM 设置;
  2. $VMHostSettings使用 Hyper-V 主机参数设置;
  3. 启动一个Foreach -Parallel循环以在每个 VM 上并行工作:
    1. 按顺序,我从 Workflow 范围写入 VM 的名称和路径;
    2. 在一项InlineScript活动中,我正在编写 VM 的名称,$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同名的工作流范围变量没有影响,这是正常行为。

现在,如果我想从 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 范围变量,对 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

关于我做错了什么的任何线索?

4

0 回答 0