Ошибка при использовании powershell с «%% G» и «%% ~ nG»

Я пытаюсь запустить приведенную ниже команду 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 ответ
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) никогда не работал у меня в пакетном файле. Двойные кавычки экранируются с помощью трех двойных кавычек (иногда требуется четыре, не знаю почему). Такие символы, как двоеточие и косая черта, не нуждаются в экранировании. Другие персонажи … Мне не нужно было заменять, поэтому я не знаю.

  • 1

    Зачем начинать с партии? Делать все это в PowerShell тривиально.

    — Кит Миллер
    4 часа назад

  • Потому что я часами возился с файлами ps1, пытаясь заставить их работать, и в конце концов сдался.

    — bat_cmd
    41 минуту назад

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *