Разделить строку в цикле foreach-объекта - PullRequest
0 голосов
/ 03 апреля 2019

Я готовлю отчет для дисков в Azure и хочу включить имя виртуальной машины, которой назначен диск. В командлете get-azurermdisk я обнаружил свойство с именем managedby, но оно представляет собой целый каталог, а не только имя виртуальной машины (которое включено в самом конце). Я хочу разделить всю строку на '/' и оставить только самую последнюю часть свойства.

Это сценарий, который я подготовил:

$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"]
    }
}

Ошибка:

Вы не можете вызвать метод для выражения с нулевым значением.

Как я могу добавить какой-то игнорировать, когда значение равно нулю выражение?

Ответы [ 3 ]

1 голос
/ 04 апреля 2019

Ошибка означает, что 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

0 голосов
/ 03 апреля 2019

Мы думаем над этим? Я что-то пропустил? Это опечатка?

foreach($dsk in $dsks)

Откуда берется $dsks? 1007 *

0 голосов
/ 03 апреля 2019

Лично я имею дело с этим методом .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(',') }
}
...