Удалить кавычки "" из строки в пакетном файле

Я использую:

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"

Основным преимуществом этого подхода является то, что вы получаете правильный результат независимо от того, запускается ли команда или нет.