作为更大脚本的一部分,我需要在继续之前验证文件内容。但是,当我使用| 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"
}
答案 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
进行字符串/文字搜索。