0

我有我目前坚持的 PowerShell 脚本的这一部分。基本上,我有两个文件要通过选择字符串进行比较...详细

对于 FileA.txt 中的每个项目,我想对 FileB.txt 执行一个选择字符串以发现它是否存在。如果 FileA.txt 中的行项目在 FileB.txt 中不存在,则将 FileA.txt 行项目打印到屏幕上。

这就是文本文件的样子..或多或少

文件A.txt

1
2
3
4
6

文件B.txt

6
7
8
9
10

所需的输出如下:

1
2
3
4

这就是我的 PS 代码现在的样子。我的思考过程是我可以在选择字符串中使用该变量,但它不适合我:(

$IPs = Get-Content "C:\\FileA.txt" 

Get-Content C:\FileB.txt | Select-String -InputObject $IPs

有人可以帮助我并指出我做错了什么。

4

2 回答 2

2

在这个特定的例子中,Compare-Object 可能是一个更好的选择。它旨在找出两个列表之间的差异。

你会使用类似的东西:

Compare-Object -ReferenceObject $(gc .\FileA.txt) -DifferenceObject $(gc .\FileB.txt) | where { $_.SideIndicator -eq '<=' } | select -expand InputObject

但是,您也可以使用 select-string 执行此操作:

gc .\FileA.txt | select-string -Pattern $(gc .\FileB.txt) -NotMatch

它只是找到与 FileB 的行不匹配的 FileA 的行,但是 FileB 的行被解释为正则表达式,这可能不适合 IP 地址,因为 '.' 是通配符。

于 2015-09-18T17:28:08.423 回答
2

根据您有限的样本数据,以下是您如何执行此操作的示例:

"1 2 3 4 6" > "fileA.txt"
"6 7 8 9 10" > "fileB.txt"

$arrayA = (Get-Content "fileA.txt").Split(" ")
$arrayB = (Get-Content "fileB.txt").Split(" ")

$arrayResult = @()

foreach($valueA in $arrayA) {
    if($arrayB -notcontains $valueA) {
        $arrayResult += $valueA
    }
}

$arrayResult -join " "

现在我相信输入文件最终会完全不同

编辑 :

使用换行符:

"1
2
3
4
6" > "fileA.txt"

"6
7
8
9
10" > "fileB.txt"

$arrayA = Get-Content "fileA.txt"
$arrayB = Get-Content "fileB.txt"

$arrayResult = @()

foreach($valueA in $arrayA) {
    if($arrayB -notcontains $valueA) {
        $arrayResult += $valueA
    }
}

$arrayResult -join "`n"

注意:这 2 个脚本从填充所需文件开始,我想你不需要这样做

于 2015-09-18T16:28:11.280 回答