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. экранирование кавычек
  2. убедитесь, что все кавычки являются «прямыми кавычками», а не угловыми
  3. поставить пробел перед кавычками (парсит правильно, но аргументы программа не понимает.)

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


person Charles McAnany    schedule 30.07.2011    source источник
comment
+1 за участие в языке D :-)   -  person Tar    schedule 24.10.2013


Ответы (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"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}

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

person Community    schedule 30.07.2011
comment
Отличный ответ. Меня несколько удивляют 4-й и 5-й примеры. Мне придется изучить парсер еще немного. Может дело в отсутствии знаков препинания? - person JasonMArcher; 01.08.2011
comment
@JasonMArcher В 4-м и 5-м примерах не является особенным, поскольку является частью токена, начинающегося с -. Однако оказывается, что символ . завершает токен, начинающийся с -. Я был возвращен 6-м примером (после того, как разобрался с делом .), потому что я не понимал, что кавычки будут просто удалены (поскольку кавычки не начинают токен, и результат все еще одиночный жетон). Это действительно было бы, если бы Microsoft опубликовала официальные (и полные) правила грамматики/токенизации. - person ; 01.08.2011

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

 $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
person mjolinor    schedule 30.07.2011