0

Objective: 比较存储在$a的字符串和存储在$b. 如果字符串中存在而$b中不存在$a,则显示这些字符串。

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

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

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

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

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

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

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

4

1 回答 1

1

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 $_ }
于 2016-05-12T23:13:17.800 回答