在Powershell Workflow中使用对象

时间:2018-03-22 14:33:30

标签: powershell powershell-workflow

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

代码的作用:

  1. 使用Json文件内容设置$VMSettings。此文件包含我要在Hyper-V中创建的VM的设置;
  2. 使用Hyper-V主机参数设置$VMHostSettings;
  3. 启动Foreach -Parallel循环以并行处理每个VM:
    1. 按顺序,我从工作流范围写出名称和VM的路径;
    2. InlineScript活动中,我正在使用$using编写VM的名称作为范围工作的测试;
    3. 如果$VM.path为空,我将开始新的InlineScript活动,其中我:
      1. 使用工作流范围中的$VM变量的内容设置新变量;
      2. 更改此新变量的path属性并显示它;
    4. 我再次显示工作流范围$VM.path以查看是否有更改。
  4. 以下是代码:

    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
    

    我们可以看到一切正常。新$VM变量的InlineScript范围修改对同名的工作流范围变量没有影响,这是正常行为。

    现在,如果我想从InlineScript活动修改工作流范围变量,我会遇到一些问题。我一直关注this Microsoft Doc page中显示这段代码的信息:

    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
    

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

0 个答案:

没有答案