Поиск и замена строки в названии и содержимом файлов и папок через powershell
Хочу автоматизировать рутинные действия с помощью скрипта на PowerShell. Использую старый работающий скрипт для поиска строк:
Get-ChildItem -Path 'D:\git\*' -Recurse | Select-String -Pattern 'String'
Пытаюсь доработать его, чтобы все найденные строки он менял, например, с String на NewString.
$PathToDirectory='D:\git\*'
$FirstString='String'
$SecondString='NewString'
Get-ChildItem -Path $PathToDirectory -Recurse | Select-String -Pattern $FirstString | ForEach-Object {
$filePath = $_.Path
$lineNumber = $_.LineNumber
$newLine = $_.Line -replace $FirstString, $SecondString
$content = Get-Content $filePath
$content[$lineNumber - 1] = $newLine
$content | Set-Content $filePath
}
В дебаге видно, что путь неправильный в ForEach (C:\Users\User\InputStream). Если создать/скопировать папку по этому пути, то будет ругаться, что это не файл, а директория. Если указать путь до файла в этой папке, то скрипт отрабатывает, но ни название ни строки в файле/папке не меняются. Буду рад любой помощи.
Ответы (1 шт):
Попробовал на примере одного файла, код вроде верный, но Get-ChildItem ищет и файлы и папки, а судя по названию папки и параметру Recurse, я предполагаю, что подпапок там навалом, потому может и происходит данная проблема. Быть может попробовать так:
$PathToDirectory='D:\git\'
$FirstString='String'
$SecondString='NewString'
Get-ChildItem -Path $PathToDirectory -Recurse -File| Select-String -Pattern $FirstString | ForEach-Object {
$filePath = $_.Path
$lineNumber = $_.LineNumber
$newLine = $_.Line -replace $FirstString, $SecondString
$content = Get-Content $filePath
$content[$lineNumber - 1] = $newLine
$content | Set-Content $filePath
}