通过变量执行cmdlet?

Bat*_*man 3 windows powershell cmdlets

我想使用一个if \ else语句来确定运行哪个cmdlet,同时为两个命令保持相同的参数:

例如我有这个电话:

    New-AzureRmResourceGroupDeployment `
        -ResourceGroupName $ResourceGroup `
        -TemplateFile $TemplateUri `
        -TemplateParameterFile $TemplateParamFile 
Run Code Online (Sandbox Code Playgroud)

但我想用变量来确定动词:

    $myVerb = if ($booleanTest) {"Test"} else {"New"}
    [$myVerb]-AzureRmResourceGroupDeployment `
         -ResourceGroupName $ResourceGroup `
         -TemplateFile $TemplateUri `
         -TemplateParameterFile $TemplateParamFile 
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

    $command = if ($booleanTest) {"Test-AzureRmResourceGroupDeployment"} else {"New-AzureRmResourceGroupDeployment"}
    $command `
         -ResourceGroupName $ResourceGroup `
         -TemplateFile $TemplateUri `
         -TemplateParameterFile $TemplateParamFile 
Run Code Online (Sandbox Code Playgroud)

我尝试了这个$command版本,但它失败了:

在C:\ Users\Administrator\Dropbox\projects\deloitte\Suncore\Dev\scripts\az -d eploy.ps1:36 char:13 + -ResourceGroupName $ ResourceGroup + ~~~~~~~~~~~~~~~~~~ Unexpected token '-ResourceGroupName' in expression or statement. At C:\Users\Administrator\Dropbox\projects\deloitte\Suncore\Dev\scripts\az-d eploy.ps1:36 char:32 + -ResourceGroupName $ResourceGroup + ~~~~~~~~~~~~~ 〜

Mar*_*agg 6

要完全按照您所描述的内容进行操作,您需要将整个命令包装为字符串,然后调用它Invoke-Expression.例如:

$MyCommand = "$myVerb-AzureRmResourceGroupDeployment -ResourceGroupName $ResourceGroup -TemplateFile $TemplateUri"
Invoke-Expression $MyCommand
Run Code Online (Sandbox Code Playgroud)

但我认为这不是编写脚本的非常明确的方法.更好的选择是使用Splatting,您可以在其中创建参数的哈希表,然后可以通过@带有变量名称的特殊字符发送cmdlet .例如:

$AzureParams = @{ 
    ResourceGroupName = $ResourceGroup
    TemplateFile = $TemplateUri
    TemplateParameterFile = $TemplateParamFile 
}

If ($booleanTest) {
    Test-AzureRmResourceGroupDeployment @AzureParams
} Else {
    New-AzureRmResourceGroupDeployment @AzurParams
}
Run Code Online (Sandbox Code Playgroud)

这也有利于避免使用反引号字符,这通常被鼓励,因为它很难发现并且容易破坏.

  • Splatting绝对是去这里的方式 (2认同)