【问题标题】:Remove empty row from array从数组中删除空行
【发布时间】:2021-07-20 20:13:58
【问题描述】:

我尝试删除数组中的空行或值,例如如果 $DBLevel 的输出为空,则应删除孔线。有没有简单的方法可以做到这一点?

谢谢

$vmname= "srvsql009"
$DBType = "sql"
$DBLevel = ""
$style = "blue"


$myCol = @()

 $x = "" | Select 'Name','DB-Type','DB-Level','Style'
 $x.Name = $vmname
 $x.'DB-Type' = $DBType
 $x.'DB-Level' = $DBLevel
 $x.'Style' = $style
 

 $myCol += $x 



 $myCol 

IsPublic IsSerial 名称 BaseType


True True Object[] System.Array

【问题讨论】:

  • 您的代码中没有$ITLevel。如果您想要一个稍后决定从中删除元素的集合,我建议使用System.Collections.Generic.List,或者干脆不添加到不满足条件的数组。
  • 嘿抱歉,复制和粘贴失败。现在代码是正确的。
  • 这是工作流程的一部分,有时变量可能会像这个例子一样为空
  • 我们还没有收到您的来信.. 任何给定的答案是否解决了您的问题?如果是这样,请通过单击左侧的 图标来考虑accepting。这将帮助其他有类似问题的人更轻松地找到它,并有助于激励其他人回答您将来可能遇到的任何问题。

标签: arrays powershell


【解决方案1】:

想象一下,您的 $myCol 变量中有这样的结果。

PS> $myCol

Name      DB-Type   DB-Level Style
----      -------   -------- -----
srvsql009 sql                blue 
SQLSRV200 cosmos    ALPHA    RED  

您可以使用Where-Object 命令过滤数组中的项目,如下所示:

PS>  $myCol | Where DB-Level -ne ""

Name      DB-Type DB-Level Style
----      ------- -------- -----
SQLSRV200 cosmos  ALPHA    RED  

PowerShell 比较运算符与大多数其他编程语言不同,这意味着您不能使用 == 比较等于,或使用 <= 进行小于或等于运算。

要了解有关比较运算符的更多信息,check out this link

【讨论】:

  • 嗨,谢谢。我知道,但可能是例如在下一次运行中“样式”为空,所以这不起作用。在数组中,服务器永远不会超过一个,如果这样更容易的话
【解决方案2】:

继续我的评论,

从简单数组 (Object[]) 中删除元素既费时又费内存,因为数组是固定长度的,当您删除一个元素时,需要在内存中重建整个数组。

如果您需要能够从中删除项目的集合,最好使用[System.Collections.Generic.List[object]]

示例集合(按照您的语法)

$vmname  = "srvsql009"
$DBType  = "sql"
$DBLevel = 120
$style   = "blue"

$list = [System.Collections.Generic.List[object]]::new()
for ($i = 0; $i -lt 5; $i++) {
    $x = "" | Select 'Name','DB-Type','DB-Level','Style'
    $x.Name       = 'srvsql{0:D3}' -f ([int]$vmname.Substring(6) + $i) # for demo, increment the number
    $x.'DB-Type'  = $DBType
    $x.'DB-Level' = if ($i -eq 3) {$null} else {$DBLevel + $i}  # for demo add an object with empty 'DB-Level'
    $x.'Style'    = $style
    # add this object to the list
    $list.Add($x)
}

$list 现在包含

Name      DB-Type DB-Level Style
----      ------- -------- -----
srvsql009 sql          120 blue 
srvsql010 sql          121 blue 
srvsql011 sql          122 blue 
srvsql012 sql          123 blue 
srvsql013 sql          124 blue 

现在,如果您想删除此列表中的一项,可以使用其索引来完成:

$list.RemoveAt(2)  # removes item 'srvsql011'

结果:

Name      DB-Type DB-Level Style
----      ------- -------- -----
srvsql009 sql          120 blue 
srvsql010 sql          121 blue 
srvsql012 sql              blue 
srvsql013 sql          124 blue 

或者通过确定要删除的对象来删除:

$x = $list | Where-Object { !$_.'DB-Level' }
$list.Remove($x)

结果:

Name      DB-Type DB-Level Style
----      ------- -------- -----
srvsql009 sql          120 blue 
srvsql010 sql          121 blue 
srvsql011 sql          122 blue 
srvsql013 sql          124 blue 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    相关资源
    最近更新 更多