Я пытаюсь запустить приведенную ниже команду powershell в пакетном файле, чтобы заменить текстовую строку во всех txt файлах, но я продолжаю видеть ошибку «не найден позиционный параметр, который принимает аргумент» словами из имен файлов, упомянутых в конец ошибки, например «-» и так далее.
FOR /F "tokens=*" %%G IN ('dir /b *.txt') DO powershell -Command "(gc %%G) -replace 'this', 'that' | Out-File -encoding ASCII %%~nG.txt"
Если я не использую %%~nG.txt
в конце команды powershell и явно сослаться на текстовый файл (в котором нет пробелов в имени файла), тогда он действительно работает.
Я уверен, это потому что %%~nG.txt
в конце не в кавычках (и должно быть, потому что в именах файлов есть пробелы?), но я не знаю, какие настройки необходимы, чтобы исправить это.
Я попытался заключить окончательное имя файла в кавычки: "%%~nG.txt"
но это не работает, я попытался экранировать второй и последний символ двойной кавычки с помощью обратного тика, поэтому Powershell не думает, что команда заканчивается на этом, но это также не работает.
Я не могу заключить команду в одинарные кавычки по другим причинам (я заменяю огромные длинные строки текста, которые сами содержат такие вещи, как одинарные и двойные кавычки, и все это работает нормально).
Могу ли я смешивать переменные командного файла с командами PowerShell, если это просто не сработает?
Я также пробовал с «jrepl.bat» (отсюда: https://www.dostips.com/forum/viewtopic.php?f=3&t=6044), и это должно заменить все двойные кавычки ничем в следующем примере, но это также не работает:
FOR /F "tokens=*" %%G IN ('dir /b *.txt') DO call "%~dp0jrepl.bat" "q" "" xseq f "%%G" /O -
Это работает для замены практически любой строки, если в ней нет двойных кавычек, тогда он этого не сделает, даже если есть xeq
вариант для него, и я установил двойные кавычки на q
как он говорит.
Ваше здоровье.
1 ответ
Дэйв приветствует. Мне удалось наконец заставить его работать, прежде чем я увидел ваш комментарий.
Прошло 6 часов проб и ошибок!
Вот решение на случай, если кто-то еще попытается это сделать.
Это использует powershell из файла bat и заменяет текстовую строку в каждом файле .txt рядом с файлом bat:
start /wait /min Powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "Get-ChildItem '*.txt' | ForEach-Object {(Get-Content $_) -replace 'old text', 'new text' | Set-Content $_.FullName}"
Говорят, что обратный тик используется в PowerShell для экранирования символов, но в пакетном файле это усложняется. Я обнаружил, что символ процента экранируется простым добавлением другого символа процента, тогда как обратный тик (escape-символ PowerShell) никогда не работал у меня в пакетном файле. Двойные кавычки экранируются с помощью трех двойных кавычек (иногда требуется четыре, не знаю почему). Такие символы, как двоеточие и косая черта, не нуждаются в экранировании. Другие персонажи … Мне не нужно было заменять, поэтому я не знаю.
Зачем начинать с партии? Делать все это в PowerShell тривиально.
— Кит Миллер
4 часа назад
Потому что я часами возился с файлами ps1, пытаясь заставить их работать, и в конце концов сдался.
— bat_cmd
41 минуту назад