1

powershell を使用して、フォルダー内の特定の種類のすべてのファイルに対してプログラムを実行しようとしていました。

最初に、フォルダー内のすべてのファイルの種類をループできるかどうかを確認するテストを行い、次のように書きました。

$files = ls *.inp
foreach ($file in $files) {echo $file.basename}

どの出力:

myfile1.inp
myfile2.inp
myfile3.inp

ここまでは順調ですね。さて、この次のビットを for ループに入れたとき、うまくいきませんでした:

$files = ls *.inp
foreach ($file in $files) {myProgram arg1=$file.basename}

myProgram へのパスは既にパス変数の一部になっているため、myProgram.exe へのフル パスを記述する必要はなく、myProgram と記述するだけでよいことに注意してください。また、arg1 = 処理したいファイル。

何が起こっているのかを確認したかったので、ループ内で上記のコマンドをエコーし​​ました。

foreach ($file in $files) {echo myProgram arg1=$file.basename}

...出力:

myProgram arg1=myfile.inp.basename

したがって、何らかの理由で、ベース名メソッドは、2 番目のシナリオで私が望んでいることを実行していません。

スクリプトを次のように変更しましたが、問題なく動作します。

foreach ($file in $files) {echo myProgram arg1=$file}

私の質問は、$file.basename が 2 つのシナリオで異なるものを出力するのはなぜですか? 2 番目の状況でのみベース名を使用したい場合、どうすればよいですか?

ありがとう!

4

1 に答える 1

1

PowerShell パーサーは$file、このコンテキスト (string 引数) を完全な式として認識します。そのため、実行$fileされ、それに「.basename」が追加されます。文字列全体を単一の式として実行するように指示するには、次のようにラップする必要があります$()

foreach ($file in $files) {myProgram arg1=$($file.basename)}
于 2013-09-16T17:48:01.100 に答える