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

Posted

技术标签:

【中文标题】在 foreach-object 循环中拆分字符串【英文标题】:Split string in a foreach-object loop 【发布时间】:2019-08-24 23:21:17 【问题描述】:

我正在为 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"]
    

错误:

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

如何添加某种 ignore when value is null 语句?

【问题讨论】:

您可以添加if函数来检查它是否为空。 【参考方案1】:

该错误意味着当您尝试对其进行拆分时,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


我写了一个示例代码和测试结果,你可以做一些改变来满足你的需要:

【讨论】:

【参考方案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 来自哪里?

【讨论】:

以上是关于在 foreach-object 循环中拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

在批处理文件中拆分以逗号分隔的字符串并在循环中调用 sqlplus 函数

如何在 Eclipse 中拆分字符串并将项目添加到 ListView(用于循环/迭代)? [关闭]

linux shell脚本:拆分字符串,将它们放在一个数组中然后循环它们[重复]

循环遍历Oracle中拆分的字符串

拆分字符串并循环遍历 MySql 过程中的值

如何在 PowerShell 中退出 ForEach-Object