目标:将存储在$a
中的字符串与存储在$b
中的字符串进行比较。如果$b
中存在$a
中不存在的字符串,则显示这些字符串。
-
我正在运行以下程序来搜索文本文件中的某些信息:
$a = Select-String -Path *.txt "<string>"
这将返回包含文本文件名称(以它们来自的服务器命名)、字符串所在的行号以及字符串本身的行。它将其存储在
$a
变量中。 -
我运行以下命令将服务器名称列表存储在变量
$b
:中$b = Get-Content servers.txt
-
我运行以下命令来比较
$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 $_ }