PowerShell中如何复用参数变量到多命令?执行时遇参数错误
PowerShell中复用Az模块命令参数的正确方法
你遇到的错误是因为把参数拼成字符串传给命令时,PowerShell会把整个字符串当成单个位置参数,但Get-AzCdnProfile需要的是-ProfileName和-ResourceGroupName这类独立的命名参数,自然会提示找不到对应的位置参数。
下面是两种可行的解决办法:
方法1:用参数哈希表(Splatting,推荐)
这是PowerShell官方推荐的参数复用方式,把参数存到哈希表里,调用命令时用@展开就行:
Import-Module Az.Cdn -Force # 先定义基础参数值 $cdnProfileName = "abc_test" $resourceGroupName = "test_dev" # 构建参数哈希表,键是参数名(不用带减号),值是对应参数内容 $cdnProfileParams = @{ ProfileName = $cdnProfileName ResourceGroupName = $resourceGroupName } # 用@符号展开哈希表作为命令参数 $cdnProfile = Get-AzCdnProfile @cdnProfileParams $endpoint = Get-AzCdnEndpoint @cdnProfileParams # 需要额外参数时直接加在后面,不影响复用的参数 $azCustomDomain = Get-AzCdnCustomDomain @cdnProfileParams -CustomDomainName "www.example.com" -EndpointName $endpoint.Name -ErrorAction Stop
这种方式不仅能复用参数,还能避免字符串解析的各种问题,代码可读性也更高。
方法2:用字符串解析(不推荐)
如果非得用字符串形式传参数,可以用Invoke-Expression来解析执行,但这种方式有安全风险(参数如果是不可信内容,可能会执行恶意代码),只适合临时测试:
Import-Module Az.Cdn -Force $cdnProfile = "abc_test" $resourceGroupName = "test_dev" $cdnProfileParameters = "-ProfileName $cdnProfile -ResourceGroupName $resourceGroupName" # 通过Invoke-Expression解析字符串命令 $cdnProfile = Invoke-Expression "Get-AzCdnProfile $cdnProfileParameters" $endpoint = Invoke-Expression "Get-AzCdnEndpoint $cdnProfileParameters" $azCustomDomain = Invoke-Expression "Get-AzCdnCustomDomain $cdnProfileParameters -CustomDomainName 'www.example.com' -EndpointName $($endpoint.Name) -ErrorAction stop"
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

