在 foreach 对象循环中拆分字符串
Split string in a foreach-object loop
我正在为 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]
并单独循环填充 "Managed By" 列:
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 when value is null 语句?
我个人处理这个问题的方法是使用 .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(',') }
}
我们是不是想多了?我错过了什么?是打错了吗?
foreach($dsk in $dsks)
$dsks
从何而来?
错误意味着当您尝试拆分时 ManagedBy
为空。
只需在此代码块 $Output = $DISK | ForEach-Object{}
,
中为 ManagedBy
添加 if else
如下所示:
$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
}
}
下面我写了一个示例代码和测试结果,你可以根据自己的需要做一些修改:
我正在为 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]
并单独循环填充 "Managed By" 列:
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 when value is null 语句?
我个人处理这个问题的方法是使用 .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(',') }
}
我们是不是想多了?我错过了什么?是打错了吗?
foreach($dsk in $dsks)
$dsks
从何而来?
错误意味着当您尝试拆分时 ManagedBy
为空。
只需在此代码块 $Output = $DISK | ForEach-Object{}
,
ManagedBy
添加 if else
如下所示:
$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
}
}
下面我写了一个示例代码和测试结果,你可以根据自己的需要做一些修改: