3

すべて!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. 引用符の前にスペースを入れます(正しく解析されますが、プログラムは引数を理解しません)。

ありがとう、チャールズ。

4

2 に答える 2

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。" ->エラー: "期待されます(最後の"は特別です)
-x"w。""->-x"wおよび。""(。は新しいトークンを開始し、その中の"は開始します
                           見積もり; ただし、引用符は削除されません)
'-x"w。"'->-x"w。" (余分な見積もりは罰金、どちらも特別ではありません)
-x "w"-> -x "w"(いいえ。および "特別ではありません)
-x "w" "-> -x" w ""(いいえ。および "特別ではありません)
a ".b"-> ab( `-`で始まらなかった、引用符は削除されました)
a ".b->エラー:"期待される( "は特別です)

したがって、それは確かに.andの-組み合わせと関係があるように見えます(そしてそれは排他的ではないかもしれません)。上記のことから、で始まるトークンには有効な文字としての文字がトークンに含まれて- いない.ため、レクサーはそのトークンを終了して新しいトークンを開始します。これは、私が持っていない優れたEBNF参照で簡単に証明できます。


私が見つけることができる最高のものは付録Cです:PowerShell文法

ParameterTokenルールは、-fooや--boolPropなどのコマンドレットパラメーターを照合するために使用されます。このルールは--foobarとも一致するため、このルールは--tokenルールの前にチェックする必要があることに注意してください。

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

ただし、これはせいぜい不完全であり、「文字」の定義すら含まれていません。

于 2011-07-30T00:26:02.460 に答える
0

実行可能ファイルがありませんが、これは機能したいようです。

 $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
于 2011-07-30T03:05:36.527 に答える