2011-12-30 7 views
0

ディレクトリを解析するスクリプトを作成しようとしていますが、同じ名前で拡張子の異なる他のファイルのうち指定された拡張子の3つの最新ファイルを見つけて、ラインプログラム。Powershellの別のプログラムに楽器を渡す

は、これまでのところ私が持っている:それは全体の多くを重要、それを使用するプログラムのために引用符で囲むことのargument2必要

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3 
\path\program argumentA $file[0] argumentB "argumentC" 
\path\program argumentA $file[1] argumentB "argumentC" 
\path\program argumentA $file[2] argumentB "argumentC" 

わからない場合。最終的に出力をファイルに書き込むか、またはボーナスの質問に記載されている別のコード行で出力を使用することをお勧めします。

問題は、引数として$ file [0]を使用すると何も起こりません。変数を使用する代わりに$ file [0]に格納されたファイル名を使用すると、実行されますが、引数Bまたは引数Cは渡されません。私がcmdから実行すると、適切な出力が得られます。

私の質問は次のとおりです。 プログラムに変数を認識させるにはどうすればよいですか? プログラムに他の引数を認識させるにはどうすればよいですか?

ボーナス質問: プログラムはファイルのリストを出力します。プログラムの出力に記載されているファイルを除いて、指定したフォルダ内のすべてを削除するにはどうすればよいですか?

+0

"一度に1行だけを渡す"ということは明確ではありません。呼び出しごとに4つの引数でプログラムを3回呼び出しています。あなたはそれがしたいことをより具体的にすることができますか? –

+0

'$ file [0] .FullName'にアクセスするとどうなりますか? –

+0

'$ file [0] .fullname'と' $ file [0] 'は同じです:' C:\ file.txt' – Philosophene

答えて

0

は私が頻繁にPowerShellで働くそれらを得るために「魔法の」ドル記号ブラケットで物事をラップする必要があることを見つける

$($file[0]) 

を試してみてください。

+0

ここには魔法はありません。ここであなたが持っているのは、[Subexpression](http://ss64.com/ps/syntax-operators.html)です。この場合、同じ 'System.IO.FileInfo'オブジェクトが返されます。 –

+0

わずかな補正ですが、実際には 'PSCustomObject'を返します。 arcessoのコードを最初に読んだとき、私は最初の行の終わりを見落としました。しかし、部分式の結果は同じで、同じオブジェクトを返します。 –

+1

はい私は理由のために "魔法"を引用しました。実際には魔法ではないと示唆するものではありませんでしたが、むしろ、これらの問題を解決する良い方法であると示唆していました。 –

0

Select-ObjectにパイプしてFullNameプロパティを選択すると、タイプSystem.Management.Automation.PSCustomObjectFullNameの3つのオブジェクトがあります。このようなプログラムのためのコマンドライン引数としてそれを使用するときは、オブジェクトのFullNameプロパティにアクセスする必要があります:あなたはSelect-Objectレットからフルネームプロパティを削除する場合はPowerShellがPSCustomObjectを作成しません

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3 
\path\program argumentA $file[0].FullName argumentB "argumentC" 

、あなたがアクセスすることができます元のSystem.IO.FileInfoオブジェクトのすべてのプロパティとメソッド。私は実際にこれでループを使用することになり

PsCustomObject

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select fullname -last 3 
$file[0] | gm 

System.IO.FileInfo

$file = dir test -Exclude *.md5 | sort -prop LastWriteTime | select -last 3 
$file[0] | gm 
0

この

あなたは違いを見ることができる方法です重複を避ける。 (そのようにして、コピー・アンド・ペーストのエラーを回避し、問題を単純化します。特に、エラー処理などを後で追加する場合は特にそうです)。

$files = dir test -Exclude *.md5 | sort -prop LastWriteTime | 
    select fullname -last 3 

foreach ($file in $files) { 
    & \path\program argumentA $file argumentB "argumentC" 
} 

PSは通常のオブジェクトと同じようにコレクションを処理しますが、これは1つのオブジェクトのみを選択しても機能します。

関連する問題