我在Azure自动化中的PowerShell中缺少什么阻止Start-AzureVM工作?

时间:2014-11-27 02:02:53

标签: azure cmdlets azure-automation

我有以下PS脚本在本地运行良好:

Get-AzureVM | Where-Object { $_.Name -eq "my-server-selector" }  | select name | ForEach-Object {
    Write-Output $_.Name 
    Start-AzureVM $_.Name $_.Name
}     

在我的本地PS控制台的上下文中,我添加了我的订阅信息,代码执行没有问题;所有虚拟机都打印到输出,服务器启动。

当我将它移到云端时,我需要做一些其他的事情,即在范围内进行订阅。我通过在门户中创建凭证资产,通过所述凭证将帐户添加到我的脚本,然后在脚本中选择正确的订阅来实现。我还将它包装在一个工作流程中(有些方面我打算在以后进行参数化)。

最终代码如下:

workflow StartServer
{   
    $credential = GetAutomationPSCredential -Name "credential-asset-name" 

    Add-AzureAccount -Credential $credential

    Select-AzureSubscription -SubscriptionName "subscription-name"


    Write-Output "Starting the server."

    Get-AzureVM | Where-Object { $_.Name -Contains "my-server-selector" }  | select name | ForEach-Object {
        Write-Output $_.Name 
        Start-AzureVM $_.Name $_.Name
    }            

    Write-Output "Execution Complete."

}

如果我删除Start-AzureVM命令,工作流程将按预期运行。我得到了打印出的所有匹配虚拟机的列表。如果我尝试重新输入命令,则会出现以下错误:

Parameter set cannot be resolved using the specified named parameters.

所以,我认为我知道的事情:

  • 凭据正在运行,因为我正在获取正确的VM列表
  • 正在设置订阅,因为它已转储到输出
  • 脚本的内部部分在本地PowerShell控制台上运行,无需任何更改

任何人都可以提供任何关于Azure自动化工作流程中需要采取哪些不同措施的想法,以使其发挥作用?

2 个答案:

答案 0 :(得分:1)

Where-Object的过滤器以及Start-AzureVM的调用中,修复在参数命名中更明确。我不确定为什么这会有所作为;正如我所说,写入服务器名称的调用在没有显式参数名称的情况下工作,但是很低,看哪,这里它与它一起工作。

内部块的最终代码如下:

Get-AzureVM | Where-Object -FilterScript { $_.Name -Contains "my-server-selector" }  | select name | ForEach-Object {
    Write-Output $_.Name 
    Start-AzureVM -ServiceName $_.Name -Name $_.Name
}   

感谢Twitter上的@DexterPOSH关于-FilterScript的方向。

答案 1 :(得分:0)

请查看有关此确切问题的http://azure.microsoft.com/blog/2014/11/25/introducing-the-azure-automation-script-converter/。在ISE中创建Powershell以进入Azure自动化时,请确保您在ISE中测试/编写Powershell工作流,因为Powershell工作流与Powershell脚本存在一些差异。

或者,如果您需要使用PS脚本并在Azure自动化中使用它,请确保导入脚本,而不是将其粘贴到其中。然后,Azure Automation会将PS脚本转换为PS Workflow。上面的链接有更多详细信息。