我正在尝试学习如何在Powershell中使用Workflow以及如何解决应用于变量的限制(在我的情况下是对象)。但是当我尝试从InlineScript活动修改工作流范围对象时,我遇到了一个问题。
代码的作用:
$VMSettings
。此文件包含我要在Hyper-V中创建的VM的设置; $VMHostSettings
; Foreach -Parallel
循环以并行处理每个VM:
InlineScript
活动中,我正在使用$using
编写VM的名称作为范围工作的测试; $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
我们可以看到一切正常。新$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
关于我做错了什么的任何线索?