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?
Вещи, которые я пробовал:
- избежать кавычек
- убедившись, что все кавычки являются "прямыми кавычками", а не под углом
- ставить пробел перед кавычками (анализирует правильно, но программа не понимает аргументы.)
Спасибо, Чарльз.
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