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 -release

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

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

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

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"w."   ->  error: " expected (last " is special)
-x"w.""  ->  -x"w and ."" (the . starts a new token and the " in that starts
                           a quote; however, the quotes are not removed)
'-x"w."' ->  -x"w." (extra quote fine, neither special)
-x"w"    ->  -x"w"  (no . and " not special)
-x"w""   ->  -x"w"" (no . and " not special)
a".b"    ->  a.b    (didn't start with `-`, quotes removed)
a".b     ->  error: " expected (" is special)

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


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

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

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

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

Ответ 2

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

 $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