cmd.exe Анализ командной строки переменных среды - PullRequest
0 голосов
/ 15 января 2011

Я не могу понять, как cmd.exe не интерпретирует что-то вроде %PATH% как переменную окружения. Учитывая эту программу:

#include<stdio.h>
#include<windows.h>

int main(int argc, char *argv[])
{
    int i;

    printf("cmd line: %s\n", GetCommandLine());
    for (i = 0; i < argc; i++) {
        printf("%d: %s\n", i, argv[i]);
    }
    return 0;
}

У меня есть эти различные выходные данные в соответствии с положением аргументов:

>args "k\" o" "^%PATH^%"
cmd line: args  "k\" o" "%PATH%"
0: args
1: k" o
2: %PATH%

>args "^%PATH^%" "k\" o"
cmd line: args  "^%PATH^%" "k\" o"
0: args
1: ^%PATH^%
2: k" o

Я думаю, это потому, что cmd.exe не распознает экранированный \" и видит экранированную двойную кавычку как закрывающую первую, оставляя в первом случае %PATH% без кавычек Я говорю это, потому что, если я не цитирую аргумент, он всегда работает:

>args ^%PATH^% "k\" o"
cmd line: args  %PATH% "k\" o"
0: args
1: %PATH%
2: k" o

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

1 Ответ

4 голосов
/ 15 января 2011

Это, по-видимому, возможно также путем экранирования кавычек:

>args ^"oo \\\^" \^" ^%PATH^%^"
cmd line: args  "oo \\\" \" %PATH%"
0: args
1: oo \" " %PATH%

Итак, из того, что я понял, это экранирующие правила:

Для среды выполнения C / CommandLineToArgvW токенизация

  1. Заменить \"\\"
  2. Заменить "\"
  3. Окружить результат двойными кавычками.

Для разбора cmd.exe

  • Выход из символов <</kbd>, > , | , & , ^ , ", % , ^ и SPACE путем добавления escape-символа ^ .
  • Экранирование пробелов не требуется, если были применены правила escape среды выполнения C, а cmd.exe предназначен только для передачи аргументов другой программе.

Эти преобразования должны применяться вПорядок, сначала правила времени выполнения C, а затем правила cmd.exe.

Если вы пишете что-то для интерпретации непосредственно cmd.exe, то должны применяться только правила cmd.exe, если программа запускается весли не использовать cmd.exe, следует применять только правила времени выполнения C.

Вот пример аргумента, интерпретируемого непосредственно cmd.exe, который записывает в файл с именем oo %PATH%:

echo test > oo^ ^%PATH^%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...