Почему cmd.exe разбирает карет по-разному - PullRequest
1 голос
/ 23 марта 2020

У меня есть следующие команды и простая программа, которая выводит полученные аргументы. Первая командная строка printer.exe arg1 \" ^" arg2 разбита на printer.exe, arg1, " и ^ arg2, а вторая printer.exe arg1 ^"arg2, которая разбита на printer.exe, arg1 и arg2. У меня вопрос, почему во второй команде пропускается каретка ^?

Спасибо!

1 Ответ

2 голосов
/ 23 марта 2020

Есть много проблем для аргументов программы.

Чтобы понять их, вам нужно знать, как анализируется строка.

Сначала анализируется строка с помощью cmd.exe.
Существует много правил (и этапов), но в вашем случае есть только два релевантных.

  1. Каждая кавычка переключает quoted-mode, в режиме кавычек специальные символы теряют свои special, что означает

  2. Символ каретки экранирует следующий символ, сама карета будет удалена.
    Символ каретки также может экранировать кавычки, чтобы избежать активации режима цитирования.
    Это работает только в режиме без кавычек, внутри кавычек каретка теряет свое особое значение.

Обратные косые черты не имеют особого значения для cmd.exe.

Для ваших примеров, cmd.exe будет анализировать их как:

printer.exe arg1 \" ^" arg2
-> printer.exe arg1 \" ^" arg2     --- The caret is inside quotes

printer.exe arg1 ^"arg2
-> printer.exe arg1 "arg2          --- The caret was outside quotes

Вкл. windows каждый program.exe отвечает за разбиение командной строки на аргументы, несмотря на linux, где оболочка решает, как разбить аргументы.

Следствием для windows программ является:
Полный беспорядок!

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

Для некоторых дополнительных объяснений Как работает Windows Командный интерпретатор (CMD.EXE) разбирает скрипты?

...