У меня есть следующий сценарий:Объединить файл IO для -replace и Set-Content в PowerShell
$allFiles = Get-ChildItem "./" -Recurse | Where { ($_.Extension -eq ".ts")}
foreach($file in $allFiles)
{
# Find and replace the dash cased the contents of the files
(Get-Content $file.PSPath) |
Foreach-Object {$_ -replace "my-project-name", '$appNameDashCased$'} |
Set-Content $file.PSPath
# Find and replace the dash cased the contents of the files
(Get-Content $file.PSPath) |
Foreach-Object {$_ -replace "MyProjectName", '$appNameCamelCased$'} |
Set-Content $file.PSPath
# Find and replace the dash cased the contents of the files
(Get-Content $file.PSPath) |
Foreach-Object {$_ -replace "myProjectName", '$appNamePascalCased$'} |
Set-Content $file.PSPath
}
Он принимает файл и делает некоторые замены, а затем сохраняет файл. Затем он принимает тот же файл и выполняет некоторую замену, а затем сохраняет файл снова. Затем он делает это еще раз.
Это работает, но кажется неэффективным.
Есть ли способ сделать все замену, а затем сохранить файл один раз?
(Если это возможно, я бы предпочел, чтобы сохранить читаемый стиль PowerShell.)
Ответ от TheMadTechnician получил мой голос. Другие вещи, когда я вижу ваш код: Первая строка неуклюжая: '. /' Is Linux for 'here', поэтому оставьте это, Get-ChildItem предполагает текущий путь (и текущий диск PS), если вы не укажете один , Трубопровод вывода в «Где-Объект» работает, но в этой команде он неэффективен, поскольку команда имеет встроенную фильтрацию. Кроме того, с предложением where-object, которое вы использовали, у вас есть фигурные скобки вокруг круглых скобок. Скобки не требуются. '$ allFiles = Get-ChildItem -recurse -Include" * .ts "'. Для Get-Content вы можете просто использовать объект $ file. 'Get-Content $ file' – Xalorous