以-eq作为字符串的Get-Content问题

时间:2018-04-04 09:39:20

标签: powershell

作为更大脚本的一部分,我需要在继续之前验证文件内容。但是,当我使用| Out-String时,它无效。

请注意,这需要在powershell v2下工作。我正在查看的文件包含数据:

{"somedata":5,"hello":[]}

如果我从命令中删除| Out-String,它会告诉我文件匹配。

但是如果我将数据添加到文件中,那么它仍然会告诉我文件是否匹配。如果我添加| Out-String,那么它会告诉我该文件没有匹配...

$filecheck = Get-Content ("C:\temp\hello.txt") | Out-String
Write-Host $filecheck
if ($filecheck -eq '{"somedata":5,"hello":[]}') {
    Write-Host "file matches"
} else {
    Write-Host "doesn't match"
}

2 个答案:

答案 0 :(得分:6)

如何解决问题,请参阅@ tukan的answer。无论如何,出于学习目的,让我们探索根本原因,即使用Out-String cmdlet。它实际上为字符串添加了换行符。像这样,

PS C:\temp> $filecheck = Get-Content ("C:\temp\hello.txt") | Out-String
PS C:\temp> write-host $filecheck
{"somedata":5,"hello":[]}

PS C:\temp>

由于数据包含换行符,因此它不等于if语句中使用的字符串文字。因此比较失败。删除Out-String并运行:

PS C:\temp>$filecheck = Get-Content ("C:\temp\hello.txt")
PS C:\temp> $filecheck
{"somedata":5,"hello":[]}
PS C:\temp> $filecheck -eq '{"somedata":5,"hello":[]}'
True
PS C:\temp>

之前您注意到需要Out-String,否则添加数据仍会使比较失败。这是为什么?假设文件中的数据是

{"somedata":5,"hello":[]}
{"moredata":1,"foo":bar}

现在发生的是Get-Content将为您提供一系列字符串。第二行包含{"moredata":1,"foo":bar}加上换行符。将这样的构造传递给比较将仅评估第一个元素,因此匹配。

将数组传递给Out-String时,结果实际上是一个包含数据,换行符,数据和额外换行符的字符串:

PS C:\temp> $filecheck|out-string
{"somedata":5,"hello":[]}
{"moredata":1,"foo":bar}

PS C:\temp>

这显然不等于if语句中使用的字符串文字。

答案 1 :(得分:1)

编辑 - 脚本将在第一场比赛时退出 Edit2 - 如果找不到任何内容,则您不需要Foreach-Object分支'失败'最后就足够了。

如何像这样流入 (Get-Content 'C:\<our_path>\test.txt') | Foreach-Object { If ($_ -eq '{"somedata":5,"hello":[]}') {write-host 'matches'; exit}} write-host 'failed'

-eq

我保留了regex的格式,即便如此,我建议import bs4进行字符串/文字搜索。