Powershell - 未能 return 作为变量的对象
Powershell - Failing to return as objects to variables
我有一个 powershell 脚本,我试图用它来根据环境销毁订阅资源组。
然而,每次我尝试将资源名称作为对象放入变量时,我似乎都会收到以下错误。
# Set the variables here
$_subscription = "Test Data Platform"
$_environment = "prd" #prd, dev, uat
Connect-AzAccount -Subscription $_subscription
Write-Host ("The acquired list of resource group names is as below:")
$rgs=Get-AzResourceGroup -Tag @{'environment'=$_environment} | Select-Object -Property ResourceGroupName
$rgs | ForEach-Object -Parallel {
$r = Get-AzResourceGroup -Name $_ -Tag @{'environment'=$_environment} -ErrorAction SilentlyContinue
if ($r) {
$message = "We have a resource group called {0}" -f $_
Write-PSFMessage $message -Level Output
try {
$message = "### Removing resource group {0}" -f $_
Write-PSFMessage $message -Level Output
Remove-AzResourceGroup -Name $_ -Confirm:$false -Force | Out-Null
$message = "### Resource group {0} Removed" -f $_
Write-PSFMessage $message -Level Output
}
catch {
$message = "### FAILED - REMOVING -Resource group {0}" -f $_
Write-PSFMessage $message -Level Significant
}
}
else {
$message = "There is no resource group called {0}" -f $_
Write-PSFMessage $message -Level Output
}
} -ThrottleLimit 25
错误
ForEach-Object : Parameter set cannot be resolved using the specified named parameters.
At C:\Test\destroy-dev-az.ps1:10 char:8
+ $rgs | ForEach-Object -Parallel {
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [ForEach-Object], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands.ForEachObjectCommand
运行 它改为在 Powershell 7 中出现以下错误:
The acquired list of resource group names is as below:
[15:44:46][<ScriptBlock>] There is no resource group called @{ResourceGroupName=Test2}
[15:44:47][<ScriptBlock>] There is no resource group called @{ResourceGroupName=Test1}
更新
通过将 $rgs
更改为 $rgs.ResourceGroupName
解决了上述错误。
正如 Santiago Squarzon 提到的 ForEach-Object -Parallel
是在 PowerShell 7.0 预览版 3[=51 中引入的=] ,所以如果您使用 Powershell ISE 它将是 Version 5.0
。所以,你会得到如下错误:
如果您在 Powershell 7 中 运行 ,那么问题是您使用的命令 获取资源组名称 通过使用 select-object
returns 输出以 CRLF 结尾 并在另一个命令中将其用作参数会出现以下错误:
ERROR: Parameter 'resource_group_name' must conform to the following pattern: '^[-\w\._\(\)]+$'.
或
所以,为了解决这个问题,您需要使用此命令 $rgs=(Get-AzResourceGroup).ResourceGroupName
获取资源名称。所以你的所有代码将如下所示:
# Set the variables here
$_subscription = "Test Data Platform"
$_environment = "prd" #prd, dev, uat
Connect-AzAccount -Subscription $_subscription
Write-Host ("The acquired list of resource group names is as below:")
$rgs=(Get-AzResourceGroup -Tag @{'environment'=$_environment}).ResourceGroupName
$rgs | ForEach-Object -Parallel {
$r = Get-AzResourceGroup -Name $_ -Tag @{'environment'=$_environment} -ErrorAction SilentlyContinue
if ($r) {
$message = "We have a resource group called {0}" -f $_
Write-PSFMessage $message -Level Output
try {
$message = "### Removing resource group {0}" -f $_
Write-PSFMessage $message -Level Output
Remove-AzResourceGroup -Name $_ -Confirm:$false -Force | Out-Null
$message = "### Resource group {0} Removed" -f $_
Write-PSFMessage $message -Level Output
}
catch {
$message = "### FAILED - REMOVING -Resource group {0}" -f $_
Write-PSFMessage $message -Level Significant
}
}
else {
$message = "There is no resource group called {0}" -f $_
Write-PSFMessage $message -Level Output
}
} -ThrottleLimit 25
输出:
我有一个 powershell 脚本,我试图用它来根据环境销毁订阅资源组。
然而,每次我尝试将资源名称作为对象放入变量时,我似乎都会收到以下错误。
# Set the variables here
$_subscription = "Test Data Platform"
$_environment = "prd" #prd, dev, uat
Connect-AzAccount -Subscription $_subscription
Write-Host ("The acquired list of resource group names is as below:")
$rgs=Get-AzResourceGroup -Tag @{'environment'=$_environment} | Select-Object -Property ResourceGroupName
$rgs | ForEach-Object -Parallel {
$r = Get-AzResourceGroup -Name $_ -Tag @{'environment'=$_environment} -ErrorAction SilentlyContinue
if ($r) {
$message = "We have a resource group called {0}" -f $_
Write-PSFMessage $message -Level Output
try {
$message = "### Removing resource group {0}" -f $_
Write-PSFMessage $message -Level Output
Remove-AzResourceGroup -Name $_ -Confirm:$false -Force | Out-Null
$message = "### Resource group {0} Removed" -f $_
Write-PSFMessage $message -Level Output
}
catch {
$message = "### FAILED - REMOVING -Resource group {0}" -f $_
Write-PSFMessage $message -Level Significant
}
}
else {
$message = "There is no resource group called {0}" -f $_
Write-PSFMessage $message -Level Output
}
} -ThrottleLimit 25
错误
ForEach-Object : Parameter set cannot be resolved using the specified named parameters.
At C:\Test\destroy-dev-az.ps1:10 char:8
+ $rgs | ForEach-Object -Parallel {
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : MetadataError: (:) [ForEach-Object], ParameterBindingException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands.ForEachObjectCommand
运行 它改为在 Powershell 7 中出现以下错误:
The acquired list of resource group names is as below:
[15:44:46][<ScriptBlock>] There is no resource group called @{ResourceGroupName=Test2}
[15:44:47][<ScriptBlock>] There is no resource group called @{ResourceGroupName=Test1}
更新
通过将 $rgs
更改为 $rgs.ResourceGroupName
解决了上述错误。
正如 Santiago Squarzon 提到的 ForEach-Object -Parallel
是在 PowerShell 7.0 预览版 3[=51 中引入的=] ,所以如果您使用 Powershell ISE 它将是 Version 5.0
。所以,你会得到如下错误:
如果您在 Powershell 7 中 运行 ,那么问题是您使用的命令 获取资源组名称 通过使用 select-object
returns 输出以 CRLF 结尾 并在另一个命令中将其用作参数会出现以下错误:
ERROR: Parameter 'resource_group_name' must conform to the following pattern: '^[-\w\._\(\)]+$'.
或
所以,为了解决这个问题,您需要使用此命令 $rgs=(Get-AzResourceGroup).ResourceGroupName
获取资源名称。所以你的所有代码将如下所示:
# Set the variables here
$_subscription = "Test Data Platform"
$_environment = "prd" #prd, dev, uat
Connect-AzAccount -Subscription $_subscription
Write-Host ("The acquired list of resource group names is as below:")
$rgs=(Get-AzResourceGroup -Tag @{'environment'=$_environment}).ResourceGroupName
$rgs | ForEach-Object -Parallel {
$r = Get-AzResourceGroup -Name $_ -Tag @{'environment'=$_environment} -ErrorAction SilentlyContinue
if ($r) {
$message = "We have a resource group called {0}" -f $_
Write-PSFMessage $message -Level Output
try {
$message = "### Removing resource group {0}" -f $_
Write-PSFMessage $message -Level Output
Remove-AzResourceGroup -Name $_ -Confirm:$false -Force | Out-Null
$message = "### Resource group {0} Removed" -f $_
Write-PSFMessage $message -Level Output
}
catch {
$message = "### FAILED - REMOVING -Resource group {0}" -f $_
Write-PSFMessage $message -Level Significant
}
}
else {
$message = "There is no resource group called {0}" -f $_
Write-PSFMessage $message -Level Output
}
} -ThrottleLimit 25
输出: