Как включить символ канала в аргумент пакетного файла из bash-скрипта? - PullRequest
6 голосов
/ 20 февраля 2009

У меня есть сценарий оболочки, который я хочу выполнить в этой строке:

qtvars.bat vsstart "qt.sln" /BUILD "Debug|Win32"

Это прекрасно работает (хотя мне пришлось изменить qtvars.bat, но это не относится к делу). Проблема в том, что я хочу, чтобы команда выполнялась в переменной: РЕДАКТИРОВАТЬ: Это не работает, если я наберу его в Bash. Раньше я набирал его в cmd.exe, что вряд ли можно было сравнить.

command="qtvars.bat"
args="vsstart"

$command $args "qt.sln" /BUILD "Debug|Win32"

Теперь он задыхается на трубе! Я получаю это сообщение:

'Win32' is not recognized as an internal or external command,
operable program or batch file.

Я пробовал кучу способов избежать кавычек и / или канала, но все безрезультатно. Интересно, что это работает, когда это исполняемый файл, а не командный файл, например ::

command="devenv.exe"
args=""

$command $args "qt.sln" /BUILD "Debug|Win32"

Спасибо за любые идеи.

Ответы [ 6 ]

7 голосов
/ 26 марта 2012

Я знаю, что вы "экранируете" символ канала в командном файле с символом ^, поэтому ...

эхо ^ | Некоторый текст здесь ^ |

Будет отображаться ...

| Некоторый текст здесь |

Я не знаю, поможет ли это вам в этом случае? Может быть, попробуйте добавить каждый символ канала к ^ и посмотреть, что произойдет? : -)

3 голосов
/ 20 февраля 2009

Это классический случай двойного экранирования, когда bash и CMD.EXE должны быть проинструктированы игнорировать специальный | (труба) символ.

Попробуйте следующее:

$command $args "qt.sln" /BUILD '"Debug|Win32"'

Это будет эквивалентно тому, как вы печатаете в командной строке CMD.EXE:

qtvars.bat vsstart qt.sln /BUILD "Debug|Win32"

Используя вышеизложенное, вы по сути заставляете передачу двойных кавычек в CMD.EXE (вместо того, чтобы их уничтожать bash). Внешние одинарные кавычки инструктируют bash не интерпретировать и не касаться того, что внутри них; внутренние двойные кавычки инструктируют CMD.EXE игнорировать любые специальные символы (в данном случае это труба).

Кроме того, вы также можете попробовать:

$command $args "qt.sln" /BUILD 'Debug\|Win32'

Это должно быть эквивалентно тому, как вы печатаете в командной строке CMD.EXE:

qtvars.bat vsstart qt.sln /BUILD Debug\|Win32

Обратите внимание на использование одинарных кавычек (!), Которые гарантируют, что bash не будет интерпретировать \ (и вместо этого передаст его как есть в CMD.EXE.)

1 голос
/ 11 августа 2012

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

1 голос
/ 28 июня 2011

Вот еще одно решение (обходной путь?), Которое я нашел:

сначала убедитесь, что переменная окружения определяет символ канала, например:
set PIPE="|"

позже, запустите команду, указав указанное выше имя переменной среды:
"c:\(...)\devenv.com" foo.sln /build Debug%PIPE%Win32

Это делает работу, даже если между вызывающим абонентом и вызываемым абонентом есть несколько оболочек. Я сейчас использую это с очень длинной цепочкой оберток: Python / Linux -> VirtualProx гостевой executeProcess -> Cmd / Windows -> devenv.com

(добавлено в: Как передать цитируемый символ канала в cmd.exe? )

0 голосов
/ 14 марта 2019

Я хотел бы рассмотреть простой маршрут и вместо него передать маркер-заполнитель - "$ P", а затем заменить его в файле CMD / Batch; например с помощью команды SEd «UnxUtils» выполнить замену:

For /F "usebackq delims=" %%r in (`Echo %Cmd% ^| sed -e "s/$P/|/g"`) do @Set Cmd2=%%r

REM  Now run the command, with the proper pipe symbol in place

%Cmd2%

Итак, пройдя команду arg / CMD скрипт args - "git status $ P wc -l".

0 голосов
/ 20 февраля 2009

Интересно! Что делает экранирование |?

Это работает?

  • echo "Debug | Win32"
  • echo "qt.sln" / BUILD 'Debug | Win32'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...