
Эта команда заменяет вхождения OldText1
, OldText2
и OldText3
в текстовом файле на , и NewText1
, когда команда находится на одной строке в пакетном файле, например:NewText2
NewText3
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_) -replace 'OldText1', 'NewText1' -replace 'OldText2', 'NewText2' -replace 'OldText3', 'NewText3' | Set-Content $_.FullName}"
Если я попытаюсь использовать ^
символ для разделения команды (что обычно работает в пакетном файле), то это не сработает. Например, это не сработает, в txt-файле ничего не заменяется:
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_) ^
-replace 'OldText1', 'NewText1' ^
-replace 'OldText2', 'NewText2' ^
-replace 'OldText3', 'NewText3' ^
| Set-Content $_.FullName}"
Использование обратных кавычек также не работает (но это и не сработает, поскольку это не скрипт PS1):
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_) `
-replace 'OldText1', 'NewText1' `
-replace 'OldText2', 'NewText2' `
-replace 'OldText3', 'NewText3' `
| Set-Content $_.FullName}"
Я спрашивал этого чат-бота все утро, и он не может придумать ничего, что сработает. Половину времени он снова помещает команду в одну строку, и я просто хожу с ним по кругу.
Неужели невозможно сделать то, что я пытаюсь сделать?
Причина, по которой я хочу разделить команду на несколько строк, заключается в том, что я просто хочу иметь возможность читать то, что заменяется, не глядя горизонтально вдоль (того, что в конечном итоге будет) огромной команды. Я намерен добавить гораздо больше команд замены, чем эта, но это не работает даже для трех команд замены... пока!
Заранее спасибо всем, кто знает, почему это не работает.
решение1
Мне это не ясно:
Get-ChildItem 'Old and New text.txt' | ForEach-Object {(Get-Content $_)
В этой части предполагается, что вы собираетесь получить элементы в папке, а точнее элементы, которые являются файлами, но ваша команда сразу же определяет файл, в котором будут выполнены замены строк прямо в содержимом.
Видите ли, удалив эту часть, замены вышли, как и ожидалось, но если это касается нескольких файлов для тех же замен, то я бы предложил отредактировать вопрос. Хотя это и запутанно, для обработки контента вам не нужно " Get-ChildItem 'Old and New text.txt' | ...
", и вы можете напрямую использоватьGet-Content 'Old and New text.txt' ^|...
start "Start PS1/CMD" /wait /min PowerShell.exe -c ^
"$Strings=Get-Content 'Old And New Text.txt' ^| %% ^
^{ $_ -replace('OldText1','NewText1')^
-replace('OldText2','NewText2')^
-replace('OldText3','NewText3')^}^
; sc 'Old And New Text.txt' -Value $Strings -Force"