Поиск и замена строки в названии и содержимом файлов и папок через powershell

Рейтинг: 0Ответов: 1Опубликовано: 30.06.2023

Хочу автоматизировать рутинные действия с помощью скрипта на 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). Если создать/скопировать папку по этому пути, то будет ругаться, что это не файл, а директория. Если указать путь до файла в этой папке, то скрипт отрабатывает, но ни название ни строки в файле/папке не меняются. Буду рад любой помощи.

Ответы

▲ 0

Попробовал на примере одного файла, код вроде верный, но 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
     [Array]$content = Get-Content $filePath
     $content[$lineNumber - 1] = $newLine
     $content | Set-Content $filePath
  }