【问题标题】:How can I use PowerShell to compare the output of a cmdlet with a list?如何使用 PowerShell 将 cmdlet 的输出与列表进行比较?
【发布时间】:2016-05-12 22:19:35
【问题描述】:

目标:将$a中存储的字符串与$b中存储的字符串进行比较。如果$b 中存在$a 中不存在的字符串,则显示这些字符串。

  1. 我正在运行以下命令来搜索文本文件以获取某些信息:

    $a = Select-String -Path *.txt "<string>"
    

    这将返回包含文本文件名称(以它们来自的服务器命名)、找到字符串的行号以及字符串本身的行。它将它存储在$a 变量中。

  2. 我运行以下命令将服务器名称列表存储在变量 $b 中:

    $b = Get-Content servers.txt
    
  3. 我运行以下命令来比较$a$b 的内容,并告诉我$b 的列表中是否存在$a 中未包含的内容:

    $b | Where-Object {$a -NotMatch $_}
    

    我显然做错了什么,因为这只是显示$a 的内容。 关于如何实现我的目标的任何想法?

【问题讨论】:

  • $b | ? { $_ -notin $a }
  • 谢谢,但是当我运行它时,它显示了 $b 的内容,导致我认为它运行并认为 $b 中的所有项目都从 $a 中丢失。
  • 您能否提供确切您正在处理哪些数据的示例列表?

标签: list powershell compare select-string


【解决方案1】:

Select-String 不返回行。它可能会以这种方式显示,但它真正返回的是一个MtachInfo object,其中包含有关匹配的特定信息的属性。

所以你真正想做的是查看每个匹配对象的.Filename 属性,类似于SERVERNAME.txt(如果我理解你的解释正确的话)并将其与服务器名称进行比较$b 我理解为SERVERNAME 的形式。

有几种方法可以做到,但因为两边都是数组,所以如果你先对它们进行归一化会有很大帮助:

$e = $a.Filename | ForEach-Object {
    $_ -replace '\.txt$',''  # trim off the extension
}
$b | Where-Object { $_ -notin $e }

此示例适用于 PowerShell v3+。

在 v2 及以下版本中执行此操作:

$e = $a | ForEach-Object {
    $_.Filename -replace '\.txt$',''
}
$b | Where-Object { $e -notcontains $_ }

【讨论】:

  • 感谢您的快速回复!我正在使用 PSv5。我尝试了第一个解决方案,不幸的是,$e 是空的。
  • 谢谢。这个也显示了 $b 的内容,让我认为它运行了,并且认为 $b 中的所有项目都从 $a 中丢失了。
猜你喜欢
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多