13

Java アプリケーション内から (Windows コマンド プロンプトを介して) PowerShell を呼び出して、さまざまなファイル属性を読み取ります。

例えば、

powershell (Get-Item 'C:\Users\erlpm\Desktop\Temp\s p a c e s.txt').creationTime

スペースが含まれている可能性があるため、ファイル パスを単一引用符で囲んでいます。ワイルドカード文字として解釈されるように見える角括弧を含むファイル パスに遭遇するまでは、問題なく動作しました。-literalPathパラメータを追加することで解決できました。

powershell (Get-Item -literalpath 'C:\Users\erlpm\Desktop\Temp\brackets[].txt').creationTime

これまでのところ、とても良いです...しかし、ファイルパスには一重引用符、ドル記号、アンパサンドなども含まれている可能性があり、これらすべての文字はPowerShellで特定の機能を持っているようで、-literalPathパラメーターが機能しないようです.

パスを二重引用符で囲むか、 ` 文字でエスケープしようとしましたが、それでも問題は解決しませんでした :-(

スペース、一重引用符、角括弧、アンパサンド、ドル記号などを含むファイル パスを PowerShell に渡す方法について何か提案はありますか?

ここの誰かが既に PowerShell 内から動作させる方法を教えてくれましたが、どういうわけか答えは削除されました (?)。

とにかく、というファイルを作成しました$ & ' [].txt。これは PowerShell内で動作します(エスケープする必要があります&):

Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt"


    Directory: C:\Users\erlpm\Desktop\Temp


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2012-08-23     14:22          0 $ & ' [].txt

しかし、Windows コマンド プロンプトから同じ PowerShell コマンドを実行すると、...

powershell Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt"

...次のエラーが表示されます。

アンパサンドは使用できません。& 演算子は将来の使用のために予約されています。アンパサンドを文字列として渡すには、「&」を使用します。
行:1 文字:55 \

  • Get-Item -LiteralPath C:\Users\erlpm\Desktop\Temp`$ & <<<< ' [].txt \
    • CategoryInfo : ParserError: (:) []、ParentContainsErrorRecordException \
    • FullyQualifiedErrorId : AmpersandNotAllowed

パラメータを使用し-commandてPowerShellコマンドを挟むと{}、まったく同じエラーメッセージが表示されます...

powershell -command {Get-Item -LiteralPath "C:\Users\erlpm\Desktop\Temp\`$ & ' [].txt"}
4

3 に答える 3

10

これは実際には cmd.exe 文字列のエスケープに関する質問です。cmd と PowerShell の文字列エスケープを組み合わせることは、まったくの悪夢です。かなりの数の試行の後、特定の例が機能するようになりました:

powershell.exe -nologo -noprofile -command ^&{ dir -LiteralPath ^"""".\`$ & ' [].txt"" }

    Directory: C:\Users\latkin
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         8/23/2012   8:46 AM          0 $ & ' [].txt

完全に直感的ですよね?

毎回 15 分間エスケープ シーケンスと格闘するか、他のアプローチを試すことができます。

ファイル名をテキスト ファイルに入れ、そこから読み取ります。

powershell.exe -command "&{dir -literal (gc .\filename.txt)  }"

また

スクリプトを使用する

powershell.exe -file .\ProcessFiles.ps1  # In processfiles.ps1 you are in fully powershell environment, so escaping is easier

また

-EncodedCommand を使用

powershell.exe -?(最後の項目を表示) またはhttp://dmitrysotnikov.wordpress.com/2011/07/06/passing-parameters-to-encodedcommand/を参照してください。

于 2012-08-23T16:08:38.347 に答える
6

一時的な .txt ファイルへのパスを書き込める場合は、次のように動作します。

(Get-Item -literalpath (gc 'C:\Temp\path.txt')).creationTime

ファイル @ C:\Temp\path.txt には、特殊文字を含むパスが含まれています。これ以外は、パスごとに各特殊文字をエスケープする必要があると思います。

上記のハックに加えて、PowerShell V3 は、新しい「マジック パラメーター」言語機能の追加により、ここで役立つようです。具体的には、こちらの「Cmd.exe からのコマンド ラインのより簡単な再利用」という見出しのセクションを参照してください。

Cmd.exe からのコマンド ラインのより簡単な再利用

Web には、Cmd.exe 用に記述されたコマンド ラインがたくさんあります。これらのコマンド ラインは PowerShell で十分に機能しますが、セミコロン (;)、ドル記号 ($)、中かっこなどの特定の文字が含まれている場合は、いくつかの変更を加える必要があり、おそらくいくつかの引用符を追加する必要があります。これが多くの軽度の頭痛の原因であるように思われました。

このシナリオに対処するために、コマンド ラインの解析を「エスケープ」する新しい方法を追加しました。マジック パラメータ --% を使用すると、コマンド ラインの通常の解析が停止され、より単純なものに切り替わります。引用符は一致しません。セミコロンにとどまりません。PowerShell 変数は展開しません。Cmd.exe 構文 (%TEMP% など) を使用する場合は、環境変数を展開します。それ以外は、行末 (またはパイプの場合はパイプ) までの引数がそのまま渡されます。次に例を示します。

 echoargs.exe --% %USERNAME%,this=$something{weird}
 Arg 0 is <jason,this=$something{weird}>
于 2012-08-23T15:08:19.333 に答える