Разделение строки в цикле foreach-object

#azure #powershell #split #disk

#azure #powershell #разделение #диск

Вопрос:

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

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

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

Ошибка:

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

Как я могу добавить какой-то оператор ignore, когда значение равно null?

Комментарии:

1. Вы можете добавить функцию if, чтобы проверить, имеет ли она значение null или нет.

Ответ №1:

Ошибка означает, что ManagedBy значение равно нулю при попытке разделить его.

Просто добавьте if else for 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
}
}
  

Я пишу пример кода и результат тестирования как удар, вы можете просто внести некоторые изменения в соответствии с вашими потребностями:

введите описание изображения здесь

Ответ №2:

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

Ответ №3:

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

foreach($dsk in $dsks)

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