如何使用PowerShell将cmdlet的输出与列表进行比较



目标:将存储在$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的内容。有什么关于我如何实现目标的想法吗?

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

所以,您真正想做的是查看每个匹配对象的.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 $_ }

相关内容

  • 没有找到相关文章

最新更新