Если в одной папке несколько файлов *.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