Power Shell выдает файл не найден ошибка при переименовании папки - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь изменить имя папки, если какой-либо файл в ней содержит строку «ErrorCode: значение», где значением может быть что угодно, кроме нуля. У меня есть старый путь в папке $ dirName и новый путь с суффиксом Ошибка в папке $ newPath.

Вот код для этого

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.data
foreach ($file in $fileNames) {
    If (Get-Content $file | %{$_ -match '"ErrorCode": 0'}) 
{

}
else{
    $dirName= Split-Path $file
    $newPath=$dirName+"Error"
    Rename-Item $dirName $newPath
}
}

Я ожидаю, что он переименует папку вместо неевыдает ошибку, что его не существует.

Как мне это решить? Также есть ли лучший подход к этой ситуации, потому что я начал изучать PowerShell до двух дней?

1 Ответ

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

Если в одной папке несколько файлов *.data, то код, который вы кодируете, переименует папку после того, как будет найден первый файл, который НЕ содержит "ErrorCode": 0. Когда он пытается получить следующий файл или снова переименовать папку, он не сможет найти его, так как он был переименован.

Вы написали, что хотите переименовать папку if файл -match '"ErrorCode": 0' но если это условие выполнено, вы выполняете {} (ничего). Однако, если условие не выполнено, вы выполняете свой код else{...}

Чтобы код не переименовывал папку несколько раз во время работы в папке, сначала соберите имена файлов в массиве, а затем переименуйте их:

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.data
$FoldersToRename = @() #initialize as array

foreach ($file in $fileNames) {
    If (Get-Content $file | %{$_ -match '"ErrorCode": 0'}) 
    {
        $FoldersToRename += Split-Path $file
    }
}

$SingelFolders = $FoldersToRename | Select-Object -Unique #Select every folder just once
$SingelFolders | ForEach-Object { 
    $newPath=$_ + "Error"
    Rename-Item $_ $newPath
}

edit : Сопоставление с чем угодно, НО '"ErrorCode": 0'

-match использует регулярные выражения (регулярные выражения), которые здесь очень пригодятся.
Anyоднозначное число, но 0 будет [1-9] в регулярном выражении. Если ваш ErrorCode может иметь несколько цифр, вы можете использовать \d{2,} для совпадения 2 или более ({2,}) чисел (\d). Совокупность этих элементов будет выглядеть следующим образом: ([1-9]|\d{2,}) (| = или)
И вот это в коде сверху:

foreach ($file in $fileNames) {
    If (Get-Content $file | %{$_ -match '"ErrorCode": ([1-9]|\d{2,})'}) 
    {
        $FoldersToRename += Split-Path $file
    }
}

edit2 : Игнорирование пробелов /tabs:

регулярное выражение для любого типа пробела: \s. * означает 0 или более: строка будет '"ErrorCode":\s*([1-9]|\d{2,})'

edit3 : необязательный «Код»:

Вот конечная строка регулярного выражения, соответствующая любому видуError с необязательными кавычками, «Код» и двоеточие:
"?Error(Code)?"?:?\s*([1-9]|\d{2,})> {$_ -match '"?Error(Code)?"?:?\s*([1-9]|\d{2,})'}
Соответствующие примеры:

«ErrorCode»: 404

«ErrorCode»: 5 ​​

«ErrorCode»: 0404

«ErrorCode»: 0404

Ошибка: 1

Ошибка1

Проверьте сами на regex101.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...