Передайте символ вертикальной черты из пакетного сценария DOS в операторе CALL.

в пакетном сценарии DOS (который должен запускаться в средах Win 200x и Win7) мне нужно передать определенный символ в кавычках другому исполняемому файлу; например

 doparse -delimeter "$"

В целом это работает:

 CALL CMD /C "doparse -delimeter "$""

К сожалению, мне нужно указать символ вертикальной черты в качестве разделителя (это требование). Я ожидал, что сработает следующее:

 CALL CMD /C "doparse -delimeter "^|""

Но когда я запускаю скрипт, я вообще не вижу никакого вывода для этой строки (например, нет сообщения об ошибке, если я заменю «doparse» каким-то несуществующим именем).

Я пробовал различные комбинации escape-символов, но не могу заставить их работать. Является ли это возможным? (К сожалению, это должно быть сделано с помощью пакетного сценария).

Спасибо


person Dan    schedule 31.03.2011    source источник
comment
Почему вы используете CMD /C? Только в старых версиях DOS, которые не поддерживали синтаксис CALL, требовалось вызывать один пакетный файл из другого. Также нет необходимости заключать параметры в CMD /C, вы имеете в виду sh -c, который принимает один параметр в кавычках.   -  person Neil    schedule 31.03.2011


Ответы (2)


Для меня работает следующее:

call delim -delimiter "|"

а затем использовать его так в вызываемом пакете:

setlocal enabledelayedexpansion
set "delim=%~2"
echo Delimiter: !delim!
person Joey    schedule 31.03.2011
comment
Вот и все. Почему-то я пропустил более простой синтаксис CALL. Спасибо Джоуи! - person Dan; 31.03.2011
comment
Решение простое, но причина сбоя сложна ;-) - person jeb; 31.03.2011

Эти версии должны работать cmd /c "test2.bat "^|"" и cmd /c ^"test2.bat "|"".
Обе запускают test2.bat.

Также работает версия Джоуи.

Проблема в вашем случае заключается в call и количестве кавычек, невозможно избежать специальных символов в выражении call (вне кавычек), по крайней мере, без специального трюка с кареткой.

Пример

set "caret=^"
call echo &
call echo ^&
call echo ^^&
call echo ^^^&
call echo "&"
call echo %%caret%%^&

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

В вашем случае | находится вне кавычек (это после второй кавычки).
И в cmd.exe есть ошибка, поэтому он немедленно останавливается, если синтаксический анализатор находит неэкранированный & или |<> после фазы вызова.

person jeb    schedule 31.03.2011