#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
берется?