Удалить кавычки "" из строки в пакетном файле
Я использую:
FOR /F "delims=" %%G IN ("%command%") DO SET command=%%~G
удалить "цитаты из переменной% command%. Если команда = " Выключение /s/t 00", после этой строки это будет: Выключение /s/t 00. и это работает.
Но когда команда содержит строку, где знак равенства (=), он также удаляет этот символ. Пример:
before, command = "D:\temp\stinger --ADL --GO --Silent --ReportPath = D:\temp --ReportOnly --Delete --Program"
После, команда = D:\temp\stinger --ADL --GO --Silent --ReportPath D:\temp --ReportOnly --Delete --Program
Посмотрите, кавычки "" удалены, но также знак =.
Итак, как удалить кавычки "" без удаления равного символа.
Спасибо
Ответы
Ответ 1
Вместо цикла for через команду вы можете просто использовать манипуляции с строкой.
set command=%command:"=%
значения после command
равны "=<nul>
, поэтому вы избавляетесь от кавычек в команде переменных. В качестве дополнительного примера вы также можете сделать %command: =_%
, чтобы заменить все пробелы в команде символами подчеркивания.
Ответ 2
Причина, по которой ваша команда выходит из строя, заключается в том, что кавычки в строке и кавычки в предложении IN() отменяют друг друга, поэтому остальная часть содержимого не цитируется. Парсер FOR/F рассматривает неуказанный =
как разделитель токенов, который преобразуется в пробел. У вас также будут проблемы с ядовитыми символами, такими как &
, |
и т.д.
Проблему можно избежать, используя задержанное расширение. Состояние задержки переключается до цикла FOR и отключается внутри цикла, так что сохраняется любая !
внутри команды.
setlocal enableDelayedExpansion
for /f "delims=" %%A in ("!command!") do endlocal & set "command=%%~A"
Основным преимуществом этого подхода является то, что вы получаете правильный результат независимо от того, запускается ли команда или нет.