工作流程错误"意外令牌"

时间:2018-01-28 12:23:11

标签: powershell azure

我有下面的工作流程,每当我尝试将其放入工作流程时,我就会发现错误。

如果我将其从工作流程中删除,我会想知道是否存在一些错误的语法,即使在工作流程中不允许这样做。

道歉,但我对工作流程的了解有限(正如您可能知道的那样)。我最终试图让VM并行启动。

workflow Set-AzureRmTags-and-Start {
    [CmdletBinding()]
    Param(
    [Parameter(Mandatory=$True)]
    [string]$VmRG
    )
    $Start = Get-Date
    Write-Output "Time is" $Start
    $VmRGs = Get-AzureRmResourceGroup | Where-Object { $_.ResourceGroupName -like "*$VmRG*" }
    foreach ($VmRG in $VmRGs) {
        $VMs = Get-AzureRmVM -ResourceGroupName $VmRG.ResourceGroupName
        ForEach ($vm in $vms) {
            $tags2 = $_.Tags
            $tags2 ['ShutdownSchedule_AllowStop'] = "$False"; 
        }
        Set-AzureRmResource -ResourceName $vm.Name -ResourceGroupName $vm.ResourceGroupName -ResourceType "Microsoft.Compute/virtualMachines" -Tag $tags2 -Force -Verbose
    }

    $Middle = Get-Date
    Write-Output "Time Taken To Assign Tags" ($Middle - $Start).Minutes "Minutes"

    ForEach -Parallel ($vm in $vms) {
        Start-AzureRmVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Verbose -Confirm:$false
    }
    $End = Get-Date
    Write-Output "Time Taken To Start VMs" ($End - $Middle).Minutes "Minutes"
    Write-Output "Total Time Taken" ($End - $Start).Minutes "Minutes"
}

错误在['ShutdownSchedule_AllowStop'] = "$False"; }错误"表达式或语句中的意外令牌"。

我有什么想法可以纠正这个问题吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

$VmRGs = Get-AzureRmResourceGroup | Where-Object { $_.ResourceGroupName -like "*$VmRG*" }
foreach ($VmRG in $VmRGs) {
    $VMs = Get-AzureRmVM -ResourceGroupName $VmRG.ResourceGroupName
    ForEach ($vm in $vms) {
        $tags2 = $_.Tags
        $tags2 ['ShutdownSchedule_AllowStop'] = "$False"; 
    }
    Set-AzureRmResource -ResourceName $vm.Name -ResourceGroupName $vm.ResourceGroupName -ResourceType "Microsoft.Compute/virtualMachines" -Tag $tags2 -Force -Verbose
}

$tags2 = $_.Tags没有意义。此时没有$_

我没有Azure标记的任何经验,但the documentation here包含您的代码应该更接近模拟的示例代码。在样本中设置标记似乎总是使用HashTable构造,如@{ShutdownSchedule_AllowStop=$false}

此部分似乎与您尝试完成的内容相关:

  

要将标记添加到具有现有标记的资源组,请检索   现有标签,添加新标签,然后重新应用标签:

$tags = (Get-AzureRmResourceGroup -Name examplegroup).Tags 
$tags += @{Status="Approved"} 
Set-AzureRmResourceGroup -Tag $tags -Name examplegroup

到目前为止,我从未研究过工作流程。经过一些测试和一些研究后,似乎意外的令牌'错误是由于工作流程中存在的代码:

function Test-ArraySubscriptFn {
    $tags2 = @{}
    $tags2['asdf'] = $false
}


workflow Test-ArraySubscriptWf {
    $tags2 = @{}
    $tags2['asdf'] = $false    # error: Only variable names may be used as the target of an assignment statement

    $tags2.Add('asdf',$false)  # error: Method invocation is not supported in a Windows Powershell Workflow...

    $tags2 += @{'asdf'=$false} # no error
}

这与Google搜索results一致。我想我们都需要对工作流differ from 'regular' powershell scripts

进行一些研究