Powershell: противоречивое / странное поведение при разборе цитаты? - PullRequest
3 голосов
/ 30 июля 2011

все!Я пытаюсь скомпилировать программу с помощью 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 -од "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. ставит пробел перед кавычками (анализирует правильно, но программа не понимает аргументов.)

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

Ответы [ 2 ]

2 голосов
/ 30 июля 2011

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

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}

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

0 голосов
/ 30 июля 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...