在foreach-object循环中分割字符串

时间:2019-04-03 12:17:04

标签: azure powershell split disk

我正在为Azure中的磁盘准备报告,我想包括为其分配磁盘的VM名称。我在get-azurermdisk cmdlet中找到了一个名为Managedby的属性,但它代表了整个目录,而不仅是VM名称(在最后包括)。我想用'/'分割整个字符串,只想保留属性的最后一部分。

这是我准备的脚本:

$DISK = Get-AzureRmDisk

$Output = $DISK | ForEach-Object {
[PSCustomObject]@{
"Name" = $_.Name
"Resource Group Name" =$_.ResourceGroupName
"Disk Tier" = $_.Sku.Tier
"Disk Type" = $_.Sku.Name
"Managed By" = $_.ManagedBy
"Time Created" = $_.TimeCreated
"Disk Size (in GB)" = $_.DiskSizeGB
"I/O per second" = $_.DiskIOPSReadWrite
"MBps per second" = $_.DiskMBpsReadWrite
"Location" = $_.Location
}
}

我已经尝试过拆分:

"Managed By" = ($_.ManagedBy).Split('/')[8]

并用单独的循环填充“管理者”列:

foreach($dsk in $dsks){
    $vm = $DISK | Where-Object -Property id -EQ $dsk.Name
    $prv = $dsk.ManagedBy.Split('/')[6]
    $managed.Add($vm.Name,$prv)
}

foreach($vm in $Output)
{
    if($ips.ContainsKey($vm."Name"))
    {
        $vm."Managed By"=$ips[$vm."Managed By"]
    }
}

错误:

您不能在空值表达式上调用方法。

如何在值为null时添加某种忽略语句?

3 个答案:

答案 0 :(得分:1)

该错误表示您尝试在ManagedBy上拆分时为空。

只需在此代码块if else中为ManagedBy添加$Output = $DISK | ForEach-Object{}

如下所示:

$Output = $DISK | ForEach-Object {
[PSCustomObject]@{
"Name" = $_.Name
"Resource Group Name" =$_.ResourceGroupName
"Disk Tier" = $_.Sku.Tier
"Disk Type" = $_.Sku.Name
"Managed By" = if($_.ManagedBy){$_.ManagedBy.Remove(0,$_.ManagedBy.LastIndexOf('/')+1)}else{"none"}
"Time Created" = $_.TimeCreated
"Disk Size (in GB)" = $_.DiskSizeGB
"I/O per second" = $_.DiskIOPSReadWrite
"MBps per second" = $_.DiskMBpsReadWrite
"Location" = $_.Location
}
}

我写了一个示例代码并测试了结果,您可以根据需要进行一些更改:

enter image description here

答案 1 :(得分:0)

我个人如何使用.net IsNullOrEmpty方法。您可以通过多种方法来执行此操作,但是如果您想在else块中设置其他值,这将是最有意义的。另外,您可以将变量设置为if语句。 Powershell会对语句进行评估,然后将输出传递给您的属性。

$test = '1,2,3,4'

[PSCustomObject]@{
  name = 'test is a string'
  test = if(-not [String]::IsNullOrEmpty($test)){ $test.split(',') }
}

$test = $null

[PSCustomObject]@{
  name = 'test is null'
  test = if(-not [String]::IsNullOrEmpty($test)){ $test.split(',') }
}

答案 2 :(得分:0)

我们是否在考虑这个问题?我错过了什么?是错字吗?

foreach($dsk in $dsks)

$dsks来自哪里?