我想使用 if\else
语句来确定运行哪个 cmdlet,同时为两个命令保持相同的参数:
例如我有这个电话:
New-AzureRmResourceGroupDeployment `
-ResourceGroupName $ResourceGroup `
-TemplateFile $TemplateUri `
-TemplateParameterFile $TemplateParamFile
但是我想用一个变量来确定动词:
$myVerb = if ($booleanTest) {"Test"} else {"New"}
[$myVerb]-AzureRmResourceGroupDeployment `
-ResourceGroupName $ResourceGroup `
-TemplateFile $TemplateUri `
-TemplateParameterFile $TemplateParamFile
或者像这样:
$command = if ($booleanTest) {"Test-AzureRmResourceGroupDeployment"} else {"New-AzureRmResourceGroupDeployment"}
$command `
-ResourceGroupName $ResourceGroup `
-TemplateFile $TemplateUri `
-TemplateParameterFile $TemplateParamFile
我尝试了 $command
版本,但失败了:
At 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
+ ~~~~~~~~~~~~~~
最佳答案
要准确执行您所描述的操作,您需要将整个命令包装为一个字符串,然后使用 Invoke-Expression
调用它。例如:
$MyCommand = "$myVerb-AzureRmResourceGroupDeployment -ResourceGroupName $ResourceGroup -TemplateFile $TemplateUri"
Invoke-Expression $MyCommand
但我认为这不是一种非常清晰的脚本编写方式。更好的选择是使用 Splatting ,您可以在其中创建参数的哈希表,然后可以通过带有变量名称的特殊 @
字符发送 cmdlet。例如:
$AzureParams = @{
ResourceGroupName = $ResourceGroup
TemplateFile = $TemplateUri
TemplateParameterFile = $TemplateParamFile
}
If ($booleanTest) {
Test-AzureRmResourceGroupDeployment @AzureParams
} Else {
New-AzureRmResourceGroupDeployment @AzurParams
}
这也有避免使用反引号字符的好处,通常鼓励使用反引号字符,因为它很难被发现且容易中断。
关于windows - 通过变量执行cmdlet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47483053/