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

输出: