Powershell: противоречивое / странное поведение при разборе цитаты?

Все! Я пытаюсь скомпилировать программу с помощью PowerShell, но команда странным образом анализируется. Эта команда выполняется правильно в cmd.exe:

dmd -od"bin" -of"bin\convHull.exe" -I"src" "src\concSort.d" "src\fileParser.d" "src\main.d" "src\pointLogic.d" "src\quickHull.d" "src\stupidHull.d" -D -O -release

Но PowerShell выполняет его следующим образом: (синий, темно- синий, фиолетовый текст в том виде, в каком они отображаются в PowerShell ISE)

dmd -od "bin" -of "bin \ convHull .exe" -I "src" "src \ concSort.d" "src \ fileParser.d" "src \ main.d" "src \ pointLogic.d" "src \ quickHull.d "" src \ stupidHull.d "-D -O -релиз

Это выплевывает следующую ошибку:

The string starting:
At line:1 char:147
+ dmd -od"bin" -of"bin\convHull.exe" -I"src" "src\concSort.d" "src\fileParser.d" "src\main.d"     
"src\pointLogic.d" "src\quickHull.d" "src\stupidHull.d <<<< " -D -O -release
is missing the terminator: ".
At line:1 char:163

Таким образом, кажется, интерпретировать период как цитату. Это своеобразно. У кого-нибудь еще была такая проблема с PowerShell?

Вещи, которые я пробовал:

  1. избежать кавычек
  2. убедившись, что все кавычки являются "прямыми кавычками", а не под углом
  3. ставить пробел перед кавычками (анализирует правильно, но программа не понимает аргументы.)

Спасибо, Чарльз.

2 ответа

Решение

Я считаю, что это должно сработать (новые строки добавлены только для ясности и удаления лишних кавычек):

dmd '-od"bin"' '-of"bin\convHull.exe"' '-I"src"'
    src\concSort.d src\fileParser.d src\main.d src\pointLogic.d src\quickHull.d src\stupidHull.d
    -D -O -release

Обратите внимание, что в случае, когда кавычка (") должна быть передана как часть самого аргумента, я окружил весь аргумент одинарными кавычками ('). Из экспериментов ниже видно, что только -of"..." нужны цитаты об этом.

Удачного кодирования.


Я не могу найти хорошую ссылку на это точное производство, однако обратите внимание на следующие разборы:

-x "ш." -> ошибка: "ожидается (последний" - особенный)
-x "w." "-> -x" w and. "" (.. запускает новый токен и "в этом начинается
                           цитата; однако цитаты не удаляются)
'-x"w."' ->  -x"w." (дополнительная цитата отлично, ни спец)
-x"w"    ->  -x"w"  (нет. и "не спец.")
-x"w""   ->  -x"w"" (нет. и "не спец.)
a".b"    ->  ab    (не начинался с `-`, кавычки удалены)
ошибка ".b     ->:" ожидается ("является особенным)

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


Лучшее, что я могу найти, это Приложение C: Грамматика PowerShell:

Правило ParameterToken используется для сопоставления параметров командлета, таких как -foo или - boolProp:. Обратите внимание, что это правило также будет соответствовать --foobar, поэтому это правило должно быть проверено перед правилом --token.

<ParameterToken> = -[:letter:]+[:]{0 |1}

Тем не менее, это в лучшем случае неполно и даже не включает определение "буквы".

У меня нет исполняемого файла, но это, кажется, хочет работать.

 $cmd = @'
 dmd -od"bin" -of"bin\convHull.exe" -I"src" "src\concSort.d" "src\fileParser.d" "src\main.d" "src\pointLogic.d" "src\quickHull.d" "src\stupidHull.d" -D -O -release
 '@

 &$cmd
Другие вопросы по тегам