在PowerShell Select-String中使用变量

时间:2015-09-18 16:16:50

标签: powershell select-string

我有我的PowerShell脚本的这一部分,我目前仍然坚持。基本上,我有两个文件,我想在via select-string上进行比较...详细说明

对于FileA.txt中的每个项目,我想对FileB.txt执行select-string以发现它是否存在。如果FileA.txt中的行项目不存在于FileB.txt中,则将FileA.txt行项目打印到屏幕。

这是文本文件的样子。或多或少

FileA.txt

1
2
3
4
6

FileB.txt

6
7
8
9
10

所需的输出如下:

1
2
3
4

这就是我的PS代码现在的样子。我的思考过程是我可以在select-string中使用变量,但它不适合我:(

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

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

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

2 个答案:

答案 0 :(得分: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个脚本首先填写所需的文件,我想你不需要这样做

答案 1 :(得分: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地址,因为&#39;。 &#39;是一个通配符。