Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

Hey, Scripting Guy!

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード (英語)

Spacer

*

Windows PowerShell を使用してドライブ上のすべての .TMP ファイルを削除する方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。Windows PowerShell を使用してドライブ上のすべての .tmp ファイルを見つけて削除する方法はありますか。

-- OR

SpacerHey, Scripting Guy! AnswerScript Center

OR さん、こんにちは。次のようなことわざがあります。魚を一尾与えれば、その日の食事に困らない。魚の釣り方を教えれば、一生食事に困らない。

ただし、このコラムを書いている Scripting Guy のように魚料理嫌いでなければの話です。魚が嫌いならば、おそらく、魚の釣り方なんて知りたくないでしょう。魚を食べなければ、魚を与えても仕方ありません。結局、彼は飢え死にし、あなたは生涯罪悪感に悩まされます。「なぜ彼に魚を与えてしまったのだろう。」と考えるでしょう。「なぜハンバーガーか何かを与えなかったのだろう。これはすべて私のせいだろうか」と。

そのとおりです。

重要なのは、実を言うと、もはや何が重要なのかわからなくなってしまいました。そう、今思い出しました。Windows PowerShell を使用してドライブ上のすべての .tmp ファイルを見つけて削除する方法について説明できるか、と言われれば、もちろんできます。しかしそれでは、1 つのスクリプトをたった 1 日実行するだけでしょう。Windows PowerShell を "学べ" ば、生涯スクリプトを実行できます (まだ空腹のままだとしても、少なくとも食べ物のことは考えずに済みます)。

Windows PowerShell に興味がある方は、2006 年 11 月 6 〜 10 日の Windows PowerShell Week (英語) に参加してください。この 1 週間は、1 つの目的に絞って計画されています。それは、Windows PowerShell を紹介することです。一連の Web キャスト (月曜日から金曜日まで毎日 1 回)、Windows PowerShell を実際に試すことができるバーチャル ラボなど、さまざまな特典 (バーチャル ラボと Web キャストを組み合わせた “Labcast” など) が用意されています。楽しく、エキサイティングで、運がよければ、いろいろと学べる場になるでしょう。魚の釣り方はお教えしませんが、Windows PowerShell の着手に必要なことはすべてお教えします。

これが重要なことです。Web キャスト中に Peter が何をするか見当もつかないですよね。もしかしたら、Peter が魚の釣り方をお教えするかもしれません。成り行きを見守りましょう。

Windows PowerShell 週間では、魚の釣り方以外にどのようなことを学べるでしょうか。ドライブ上のすべての .tmp ファイルを見つけて削除する方法などはどうでしょう。

get-childitem c:\ -include *.tmp -recurse | foreach ($_) {remove-item $_.fullname}

信じられないかもしれませんが、これで全コマンドです。ご覧のとおり、タイピング好きでなければ、Windows PowerShell はまるで夢のようです。ここに示したコマンドには、実は、2 つのコマンドが含まれています。まず、ドライブ C 上のすべての .tmp ファイルのコレクションを取得し、次にこれらの各ファイルを削除します。では、どのように行うのでしょうか。その方法がわかるかどうか確認しましょう。

まず、Get-ChildItem Cmdlet を使用して、ドライブ C 上のすべての .tmp ファイルのコレクションを取得します。その処理は次のコードで行います。

get-childitem c:\ -include *.tmp -recurse

これは、実に簡単です。3 つのパラメータを渡して Get-ChildItem を呼び出します (ファイル システムで作業しているときの dir コマンドに似ています)。

"c:\" は、検索を開始するフォルダを表します。

"-include *.tmp" は、拡張子が .tmp のファイルのみを返すように Get-ChildItem に指示します。拡張子が .temp のファイルも含めるとしましょう。それも可能です。必要なのは、含めるファイルの一覧に .temp を追加するだけです。その場合 "-include *.tmp, *.temp" のように指定します。

"-recurse" は、C:\ の全サブフォルダ内のファイルを検索することを Get-ChildItem に指示します (さらに、各サブフォルダ内の全サブフォルダと繰り返します)。これはすばらしい機能です。フォルダのサブフォルダ内のファイルを検索するために、複雑な再帰関数を記述する必要はありません。–recurse パラメータを追加するだけです。

コレクションを取得したら、コマンドの後半部分にそれを "パイプ" 出力します (記号 | はパイプラインを表します)。言うまでもなく、Windows PowerShell 週間では、パイプについて詳しく説明します。ここでは簡単に説明します。Get-ChildItem 自体は、通常コレクションを取得し、取得した情報を画面に表示します。しかし、.tmp ファイルを画面に表示することではなく、それらのファイルを削除することが目的です。そこで、画面に項目を表示する代わりに、コレクション全体をコマンドの後半部分に渡す (パイプする) ことを Get-ChildItem に指示します。

忘れてしまった場合に備えて、次にコマンドの後半部分を示します。

foreach ($_) {remove-item $_.fullname}

ここでは、For Each ループを設定し、Get-ChildItem から渡されたコレクションをループします。ここではあまり構文を気にする必要はありません。Windows PowerShell 週間で、For Each ループについて詳しく説明します。ただし、"$_" はパイプラインの個々の項目を表す Windows PowerShell の特別な変数であることは述べておきましょう。"foreach ($_)" というのは、次のような VBScript ステートメントに相当します。

For Each objItem in colItems

つまり、コレクション内のすべてのファイルをループします。

では、各ファイルに何を行えばよいでしょう。もちろん、Remove-Item を使ってファイルを削除します。

{remove-item $_.fullname}

ここでは、コレクション内の各ファイルの FullName プロパティを唯一のパラメータとして渡して Remove-Item を呼び出します (FullName はファイル パスに相当します)。信じられないかもしれませんが、これで作業は完了です。残りは Remove-Item が処理します。

どういうことでしょう。これはすばらしいと思っても、Windows PowerShell を初めて使用することから考えると、ファイルをまとめて削除するスクリプトを実行するのは少し心配ですね。問題はありません。不安な場合には、次のように Remove-Item コマンドに –whatif パラメータを追加します。

get-childitem c:\ -include *.tmp -recurse | foreach ($_) {remove-item $_.fullname -whatif}

この –whatif パラメータは非常に優れています。.tmp ファイルを削除するのではなく、実際にすべてのファイルの削除を Remove-Item に指示するとどうなるかを簡単に示します。この場合、実際にコマンドを実行して削除されるファイルのレポートが返されます。

What if: Performing operation "Remove File" on Target "C:\WINDOWS\SET3.tmp". 
What if: Performing operation "Remove File" on Target "C:\WINDOWS\SET4.tmp". 
What if: Performing operation "Remove File" on Target "C:\WINDOWS\SET8.tmp".

これは、Windows PowerShell だけに備わった、ファンタジー フットボールのような機能です。

ともあれ、もう失礼しなければなりません。防水ズボンをはいて釣竿を持った Peter がちょうど通りかかりました。正直なところ、Peter はいつも変わった格好をしています。ただ、念のため、彼のもくろみを確認しておくべきでしょう。


ページのトップへページのトップへ