Powershell 即使没有比赛也要比赛

Powershell 即使没有比赛也要比赛,powershell,Powershell,我正在尝试在powershell中使用-match查找字符串“ErrorCode”:1。我发现许多文件的错误代码为:1。问题是,当我打开一个匹配表达式的结果文件进行检查时,我甚至没有找到单词ErrorCode,文件名仍然作为输出提供给我 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> <HTML><HEAD><TITLE&g

我正在尝试在powershell中使用-match查找字符串“ErrorCode”:1。我发现许多文件的错误代码为:1。问题是,当我打开一个匹配表达式的结果文件进行检查时,我甚至没有找到单词ErrorCode,文件名仍然作为输出提供给我

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Not Found</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Not Found</h2>
<hr><p>HTTP Error 404. The requested resource is not found.</p>
</BODY></HTML>
我试图检查文件,但许多文件具有我正在搜索的字符串,但许多文件没有

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.data
$FoldersToRename = @() #initialize as array
foreach ($file in $fileNames) {
    If (Get-Content $file | %{$_ -match '"ErrorCode":1'}) 
    # If (Get-Content $file | %{$_ -match '"ErrorCode": [1-9]\d*'}) 
    {
        $FoldersToRename += Split-Path $file
        echo $file
    }
}
这是我作为输出得到的文件内容之一

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Not Found</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Not Found</h2>
<hr><p>HTTP Error 404. The requested resource is not found.</p>
</BODY></HTML>

找不到
找不到
HTTP错误404。找不到请求的资源


有人能解释一下这个文件是如何输出的吗?

试着将Get Content命令分开

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.data
$FoldersToRename = @() #initialize as array
foreach ($file in $fileNames) {
    $content = Get-Content $file
    If ($content -match '"ErrorCode":1'}) 
    # If (Get-Content $file | %{$_ -match '"ErrorCode": [1-9]\d*'}) 
    {
        $FoldersToRename += Split-Path $file
        echo $file
    }
}

从开始到结束,您已经有了一个有效的解决方案。这里的问题是,
Get Content$file |%{$\u-match''ErrorCode:[1-9]\d*}
返回一个数组(值为
true
false
值),因此
if
语句总是
true


要么按照我之前的建议,要么按照

问题在于,如果文件包含内容,IF语句的措辞将是正确的。使用正则表达式检查文件内容的更好方法是使用Select字符串,这比所有这些循环废话要简单得多。大概是这样的:

$FoldersToRename = (Split-Path (Get-ChildItem -Path $scriptPath -Recurse -Include *.data | Select-String -pattern '"ErrorCode":1').Path) | Select -unique

这个重复的问题怎么可能重复?即使在使用了上一个问题中您自己的代码之后,我还是得到了一些文件作为输出,这些文件甚至没有一个单词ErrorCode。它给我的错误是“Split Path:无法将参数绑定到参数'Path',因为它是空的”,这是因为您的文件内容都与该正则表达式不匹配。我的代码只是一个示例,您可能需要为自己的上下文添加一些真实世界的附加内容。我想说的一点是,选择字符串的功能远比您使用的方式强大,代码更少。谢谢您的解释。现在我明白是什么导致了问题。