windows - 通过变量执行cmdlet?

标签 windows powershell powershell-cmdlet

我想使用 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/

相关文章:

windows - Delphi - 托盘图标中的文本

powershell - 使用 NSIS 检查已安装的 Windows Server 功能

powershell - Env : and [System. Environment] 有什么区别?

validation - PowerShell : GetNewClosure() and Cmdlets with validation

windows - 更新帮助和保存帮助不起作用

windows - 使用 Windows 驱动程序模型的虚拟驱动程序 - 从哪里开始?

linux - RAM如何分配?

Windows 上的 C++ - 控制台窗口闪烁并消失。这是怎么回事?

powershell - 使用 Invoke-Command 时提升的权限

powershell - 使用 powershell 导出 azure db 时出现错误