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+ ~~~~~~~~~~~~~ 〜
要完全按照您所描述的内容进行操作,您需要将整个命令包装为字符串,然后调用它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)
这也有利于避免使用反引号字符,这通常被鼓励,因为它很难发现并且容易破坏.
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |