2009-04-18 11 views
1

Powershell 1.0で奇妙なことが起こっているのですが、Powershellがそれに対応している理由を理解できません。内部ロジックでのPowershellの問題

状況:私は手紙eでドライブ上のいくつかのzipファイルを作成しました:

は今、私はそれらをすべて削除したいです。しかし、e:ドライブにはzipファイルがたくさんあります。だから私はこの特定のフォルダとそのサブフォルダのものだけを削除したいと思う。私はこのために使用したい

コマンドは、次のとおりです。\テスト:しかし、実行時に、私はすべての

はパスEを見つけることができませんと言って、エラーのの束を得る

PS E:\> Get-ChildItem -Path E:\Webdev\icons\ -Include *.zip -Recurse -Name -Force | Remove-Item -Force 

。ジップは なので存在しません。それは私がスクリプトを手渡しアイコンのフォルダの下に存在する :

実際、電子の下で直接test.zipとしてはそのようなファイルがありません。

私の解決策は、アイコンフォルダへのディレクトリを変更し、そこでコマンドを実行することです。

しかし、これは論理的ではありません。どのディレクトリにファイルを削除する必要があるのか​​を伝えたいのですが、そこで削除する必要があります。 Powershellが現在のディレクトリ内のファイルを探し始めるのはなぜ私にとって謎なのか?

誰でも私にこのことを説明できますか?

答えて

8

あなたがパイプラインの最後にRemove-Itemを削除する場合は、返されるすべてのパス名は、あなたがGet-ChildItem-Pathパラメータを経由して入力されたパスに対して相対的であることがわかります。したがって、Remove-Itemは現在のディレクトリ内のすべてのパスを調べますGet-ChildItemが返されます。

caparが示唆しているように、ここでは-Nameパラメータが問題です。それはあなたがRemove-Itemが簡単にファイルを見つけることができますFileオブジェクトを取得することを保証します削除:意図したとおりに

Get-ChildItem -Path E:\Webdev\icons\ -Include *.zip -Recurse -Force | Remove-Item -Force 

は動作します。オブジェクトで何かを解決できれば、文字列レベルに落とさないでください。

+0

+1実際、私の解決策 –

+0

よりも簡単に動作しているようです。その特定のパラメータがどのように結果に影響を与えるかは不思議です。 – KdgDev

+2

このパラメータは、FileInfoオブジェクトの代わりに文字列を返すようにコマンドレットに指示します。 Remove-Itemは、FileInfoを取得するときに何を削除するかを調べるのに十分なほどスマートですが、文字列ではパス名を取ることしかできません。それらはあなたが指定したパスからの相対パスであるため、推測できるだけです。おそらく-Nameパラメータは、表示目的でのみ存在します。しかし、オブジェクトを使うことは、パイプラインでもっと簡単です。 – Joey

3

Get-ChildItemは、検索パスに続くパスの部分と、-Nameを使用するときのファイル名を返します。このファイル名は、現在のディレクトリと返されたファイル名を使用しているRemove-Itemにパイプされます。

-FullNameを使用してそのコマンドを試しましたが、そのコマンドがSelect-Objectにパイプされて、Full-nameとパイプをRemove-Itemにパイプする必要があります。

試してみてください。

Get-ChildItem -Path E:\Webdev\icons -Include *.zip -Recurse | 
Select-Object -Property FullName | Remove-Item -Force 
関連する問題