2014-02-13 3 views
11

я использую:удалить кавычки «» из строки в пакетном файле

FOR /F "delims=" %%G IN ("%command%") DO SET command=%%~G 

удалить «» цитату из переменной команды%%. Если команда = «Shutdown/s/t 00», после этой строки это будет: Shutdown/s/t 00. и это работает. Но когда команда содержит строку, где знак равенства (=), он также удаляет этот символ. Пример:
до того, команды = "D: \ Temp \ Стингер --ADL --GO --silent --ReportPath = D: \ Temp --ReportOnly --delete --program"
После того, команда = D: \ Temp \ стингер --ADL --GO --silent --ReportPath D: \ Temp --ReportOnly --delete --program

Посмотрите, кавычки "" удаляются, но и знак знак равно

Итак, как удалить кавычки «" без удаления одинакового символа.

Благодаря

+0

ответил на http://stackoverflow.com/a/5181182/492 –

+0

Возможный дубликат [Удаление двойных кавычек из переменных в пакетном файле создает проблемы с средой CMD] (http://stackoverflow.com/questions/1964192/ remove-double-quotes-from-variables-in-batch-file-создает-problems-with-cmd-ru) –

ответ

28

Вместо того чтобы использовать цикл через команду, вы могли бы просто использовать манипуляции строки.

set command=%command:"=% 

значение после command является "=<nul> поэтому вы избавившись от кавычек в переменной команде. Также, как дополнительный пример, вы также можете сделать %command: =_%, чтобы заменить все пробелы в команде символами подчеркивания.

+0

Ницца, он работает, спасибо! – Phiber

+3

+1 для обработки строк. ** Предложение: ** 'if defined command set" command =% command: "=%" 'Перед использованием строковой манипуляции вы хотите проверить, что команда определена, потому что, если команда не существует, то манипуляция не будет выполнена и' set 'сделает команду буквально равной'% command: "=%' –

+0

@Phiber, если вам интересно - просмотрите страницу [dostips] (http://www.dostips.com/DtTipsStringManipulation.php) при обработке строк. – unclemeat

6

Причина, по которой ваша команда не работает, заключается в том, что кавычки в строке и кавычки в предложении IN() отменяют друг друга, поэтому остальная часть содержимого не цитируется. Парсер FOR/F рассматривает некотируемый = как разделитель токенов, который преобразуется в пространство. У вас также были бы проблемы с ядовитыми персонажами, такими как &, | и т. Д.

Проблема устранена с помощью отложенного расширения. Состояние задержки переключается до цикла FOR и выключается внутри цикла, так что любые ! в команде сохраняются.

setlocal enableDelayedExpansion 
for /f "delims=" %%A in ("!command!") do endlocal & set "command=%%~A" 

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

+1

Мне было интересно, почему это не работает. Необходимость «setlocal enabledelayedexpansion» – leeman24

Смежные вопросы