Получение совпадения, даже если его нет - PullRequest
2 голосов
/ 09 октября 2019

Я пытаюсь найти строку «ErrorCode»: 1, используя -match в powershell. Я нашел много файлов с ErrorCode: 1. Проблема в том, что когда я открывал файл, полученный в результате выражения соответствия, для проверки, я даже не нашел слова ErrorCode, и все-таки имя файла было дано мне в качестве вывода

Я пытался проверить файлы, ново многих файлах есть строка, которую я ищу, но во многих ее нет.

$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>

Может кто-нибудь помочь объяснитькак этот файл должен быть в выводе?

Ответы [ 3 ]

2 голосов
/ 09 октября 2019

У вас уже есть рабочее решение от моего предыдущего ответа на ваш вопрос. Проблема здесь в том, что Get-Content $file | %{$_ -match '"ErrorCode": [1-9]\d*'} возвращает массив (из true или false значений), поэтому оператор if всегда true.

Либо следуйте моему предыдущему предложению, либо Майка

1 голос
/ 09 октября 2019

Попробуйте разделить команду 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
    }
}
0 голосов
/ 09 октября 2019

Проблема в том, как вы сформулировали выражение IF, будет верно, если файл имеет содержимое. Лучшим способом проверки содержимого файлов с помощью регулярных выражений было бы использование Select-String, что намного проще, чем вся эта бессмысленная зацикливание. Как то так:

$FoldersToRename = (Split-Path (Get-ChildItem -Path $scriptPath -Recurse -Include *.data | Select-String -pattern '"ErrorCode":1').Path) | Select -unique
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...