1

我有以下在本地运行良好的 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.

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

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

任何人都可以提供有关在 Azure 自动化工作流中需要以不同方式完成哪些工作以使其正常工作的任何想法吗?

4

2 回答 2

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.

于 2014-11-27T14:11:08.983 回答
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 自动化将为您将 PS 脚本转换为 PS 工作流。上面的链接对此有更多详细信息。

于 2014-11-27T19:52:51.287 回答