2014-01-27 3 views
0

Я пытаюсь понять, как побег^Caret работает в пакетной CMD. Допустим, я печатаю эту строку в CMD окно, я ожидал бы, чтобы отправить данные DIR в «C: \ мой text.txt»Двойные котировки в пакетной строке redux

CMD.EXE "/C > ^"c:\my text.txt^" DIR C:\*.*" 

Вместо этого я получаю ошибку:

'txt.txt" DIR *.*"' is not recognized as an internal or external command, 
operable program or batch file. 

Если я что-то так просто, как это:

ECHO "^"^"" 

Expected: """" 
Actual : "^""" 

Даже если я пытаюсь дважды процитировать так:

ECHO " "" "" " 

Expected: " " " " 
Actual : " "" "" " 

Может кто-нибудь «рассказать, как это работает и что является надежным способом - избежать двойных кавычек в командной строке?

Спасибо.

Дополнительный пример:

Почему это работает:

cmd.exe "/C sqlcmd.exe -S.\SQLEXPRESS -E -Q"select suser_name()" > "c:\temp\test 1.txt"" 

, но это дает ошибку "Система не может найти указанный путь." и не создает txt-файл.

cmd.exe "/C "sqlcmd.exe" -S.\SQLEXPRESS -E -Q"select suser_name()" > "c:\temp\test 1.txt"" 

Я знаю, что не нужно в этом случае, но как бы я прилагаю команду sqlcmd.exe в кавычках?

Я также попытался удалить кавычки из всей линии с теми же результатами, т.е.

cmd.exe /C "sqlcmd.exe" -S.\SQLEXPRESS -E -Q"select suser_name()" > "c:\temp\test 1.txt" 

Еще раз спасибо.

ответ

2

Цитаты являются государственной машиной в cmd.exe. Первая цитата включает цитирование семантики, следующая цитата отключает ее, следующий назад и т. Д.

Можно избежать цитаты, чтобы она не включала семантику цитаты.

Например, следующий отправит кавычку в test.txt

echo ^" >test.txt 

Без побега, строка " >test.txt просто выводится на экран.

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

Например, предположим, что вы хотите напечатать строку "hello world" >"test.txt" на экране. Ни один из методов, которые вы пробовали, не будет работать, потому что внутренняя цитата не может быть экранирована. Форма ^" обрабатывает ^ как литерал, и вывод все равно будет перенаправлен в файл. "" для правильной цитаты >, поэтому перенаправления нет, но теперь у вас есть два кавычки вместо одного.

У вас есть два варианта.

1) избежать всех «яд» символы, которые не котируемые

echo "hello world" ^>"test.txt" 

2) скрыть котировку буквального в переменной замедленного расширения

Я предполагаю, что этот код находится в пакетный скрипт.

setlocal enableDelayedExpansion 
set "quote="" 
echo "hello world!quote! >!quote!test.txt" 

Обратите внимание, что с помощью этого метода может стать сложнее, если имеем дело с FOR /F ... IN('command') или CMD /C потому что задержка расширения, вероятно, будет выключен в новом контексте CMD.EXE.


Вот способ сделать ваш оригинальный команда

cmd /c dir c:\*.* ^>"c:\my text.txt" 

Обратите внимание, что вся командная строка после /c не должны быть заключены в кавычки. В этом случае это проще, если это не так.


Я считаю, что ваша новая команда в конце может быть записана следующим образом:

cmd.exe /C ""sqlcmd.exe" -S.\SQLEXPRESS -E -Q"select suser_name()" > "c:\temp\test 1.txt"" 

При использовании в скобках блока, то правая скобка должны быть экранированы.

(
    cmd.exe /C ""sqlcmd.exe" -S.\SQLEXPRESS -E -Q"select suser_name(^)" > "c:\temp\test 1.txt"" 
) 
+0

Спасибо за ответ. Я добавил дополнительный пример выше, поскольку комментарии допускают ограниченное форматирование. Я пробовал использовать ваши предложения, но до сих пор не повезло. –

+0

@Neilw - Я проверил код в своем ответе, и все они работают (я забыл включить 'setlocal enableDelayedExpansion' - было сделано редактирование). У меня не было возможности работать над более сложной командой в вашем отредактированном ответе. – dbenham

+0

@Neilw - Хорошо, я думаю, у меня есть решение для вашего обновленного вопроса. – dbenham

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