Skip to main content
評価してください: 

 

ファイルとフォルダー第 1 部

スクリプト作成初心者のためのコラム、"Sesame Script" へようこそ。このコラムの目的は、システム管理自動化に使用する Windows スクリプトの基礎を紹介することです。ここでは、スクリプトを読んで理解し、必要に応じてスクリプトを変更するために必要な情報を提供しています。スクリプト作成について何かよくわからない点がありましたら、 ご連絡ください (英語のみ)。多くの方が同じ疑問を抱えているはずです。

過去の記事については、 Sesame Script アーカイブを参照してください。

ページのトップへ

ファイルとフォルダーに関する多くの側面

Scripting Guys はたいてい正直者なので、正直に言いましょう (正直者であることが、必ずしも得策とは限りませんが)。Scripting Guys は飽きてしまいました。ここで、飽きてしまった理由を説明することはできますが、正直に言うことが自分のためにならないときがあることは認識していて、今がまさに、そのときなので止めておきます。これは自分たちのためにならないだけでなく、皆さんが Scripting Guys の話をもう一度聞きたいと思っている場合は、皆さんのためにもならないでしょう。

そこで、皆さんも同じように飽き飽きしているでしょうから、通常の Sesame Script の域を超えて、2 回 (場合によっては 3 回) のシリーズ構成で大規模なトピックを取り上げることにしました (私たちが飽き飽きしていることを理解されていない方は、突然の展開に驚かれたことと思います)。

前回の Sesame Script の記事では、えびの話をしました。今回は、そんなことはしません。今回は "代位" について説明します。代位について説明するのは、これが格好いい単語であり、Scripting Guys はこの単語の意味を理解するために、調べる必要があったからです。皆さんが「代位」について調べる手間を省くために説明しましょう。代位とは、出張に行ったのに、頭を針で縫って帰ってくるはめになったという状況のことです。

そうですね。完全に正しいとは言えません。実際には、保険会社が病院から請求書を受け取るまで代位弁済は生じません。

ここから、ファイルとフォルダー、そして日付に関する今月のトピックにそのままつながります (おわかりだと思いますが、先月のえびの話には理由がありました。それは、今月の代位の話に持っていくためだったのです)。

代位とは違って、ファイルとフォルダーというトピックは、少なくとも、お送りいただいた電子メールを基準に考えると、一般的なものだと思います (さいわい、代位に関する電子メールはほとんどありません。ただし、お送りいただいた電子メールには、担当の Scripting Guy が、決まり文句を書いたり、たくさんの質問に答えたりする必要があります)。お送りいただいたファイルとフォルダーに関する数多くの質問は、主にファイルの移動についての質問だったので、今回の記事では、主にその処理について説明しましょう。

ファイルの移動について説明するのに、一体なぜ 2 回分 (または 3 回分) の記事を必要とするのか、疑問に思われているかもしれません。それは、ファイルを移動する方法が 1 つだけではないからです。たとえば、FileSystemObject オブジェクトを使用する方法や、Windows Management Instrumentation (WMI) を使用する方法があります。それから、Windows PowerShell を使用する方法もあります。3 つ目の記事を執筆することになれば、Windows PowerShell を使用する方法について説明しますが、まだ未定です。2 か月以内には、お答えできると思います。Windows PowerShell を使用する方法について Sesame Script で読みたいと思われた場合は、その間に ご連絡ください (英語のみ)

今回紹介する 2 つの方法を使用する際には、それぞれ長所と短所があります (とりあえず、3 つ目の選択肢については、ここでは触れません)。いくつか例を挙げてみましょう。

  • WMI を使用すると、リモート コンピューター上のファイルとフォルダーにアクセスできるが、FileSystemObject オブジェクトは (ほとんどの場合) ローカルでしか使用できない。

  • FileSystemObject オブジェクトを使用した方が、特に日付に関しては、操作が少し簡単になる。

両者の違いに関する詳細については、 Microsoft Windows 2000 Scripting Guide (英語) を参照してください。

今月の記事 (第 1 部だということは既におわかりでしょう) では、FileSystemObject オブジェクトを使用して、ファイルとフォルダーを操作する方法について紹介します。

ページのトップへ

ファイルとフォルダーを確認する

質問 1: 被ったすべての傷害、疾患、またはその両方を確認してください。

気にしないでください。代位弁済の手続きの一部です。この話は本当にまったく難しくありません。

この話は、傷害が既に起こったという前提、より正確に言うと、操作するファイルが既に存在するという前提で始めます。そうでない場合は、代位弁済を行う必要はありません。

もちろん、今回はこのような前提は立てません。代わりに、次のようにして、操作するファイルやフォルダーが存在するかどうかを確認します。

 
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists("C:\scripts") Then
    If objFSO.FileExists("C:\scripts\test.txt") Then
        Wscript.Echo "Folder and file exist"
    Else
        Wscript.Echo "Folder exists, file doesn't"
    End If
Else
    Wscript.Echo "Folder does not exist"
End If

このスクリプトでは、まず、CreateObject メソッドを使用して、Scripting.FileSystemObject オブジェクトのインスタンスを作成します。

Set objFile = objFSO.CreateTextFile("C:\Scripts\FreeSpace.txt", False)

次に、If ステートメントを使用します。この If ステートメントは、入れ子になっている (つまり If ステートメント内に If ステートメントがある) ので、少し厄介です。ここでは、特定のフォルダーが存在するかどうかを確認する必要があります。フォルダーが存在する場合は、続いて、そのフォルダー内の特定のファイルがあるかどうかを確認します。その後、結果を示すメッセージをエコーします。まず、フォルダーが存在するかどうか確認します。これは、FileSystemObject オブジェクトで FolderExists メソッドを呼び出して実行します。

If objFSO.FolderExists("C:\scripts") Then

ここでは、C:\scripts フォルダーを確認するため、C:\scripts を FolderExists メソッドにパラメーターとして渡しました。FolderExists メソッドでは、フォルダーが存在する場合は True を返し、存在しない場合は False を返すので、If ステートメント内にメソッド呼び出しを配置できます。フォルダーが存在する場合 (FolderExists メソッドから True が返された場合)、次の If ステートメントに移動します。

If objFSO.FileExists("C:\scripts\test.txt") Then

今度は、フォルダーが存在するかどうかを確認するのではなく、ファイルが存在するかどうかを確認します。そのため、ファイルの名前を FileExists メソッドに渡します (現在のディレクトリにあるファイルを確認する場合は、ファイルの完全パスを渡す必要はなく、ファイル名だけを渡せます)。FileExists メソッドでは、指定したファイルが存在する場合は True を返し、存在しない場合は False を返すので、FolderExists メソッドと同様に、If ステートメント内にメソッド呼び出しを配置できます。FileExists メソッドから True が返された場合、つまりファイルが存在する場合、フォルダーとファイルの両方が存在することを示すメッセージをエコーします。

Wscript.Echo "Folder and file exist"

フォルダーが存在することは既に確認済みなので、FileExists メソッドから False が返された場合は、Else ステートメントに移動して、フォルダーは存在するがファイルが存在しないことを示すメッセージをエコーします。

Else
    Wscript.Echo "Folder exists, file doesn't"

最後に、(FolderExists メソッドから False が返されたために) 2 つ目の If ステートメントに到達しなかった場合は、外側の Else ステートメントに移動して、フォルダーが存在しないことを示すメッセージをエコーします。

Else
    Wscript.Echo "Folder does not exist"

ページのトップへ

ファイルとフォルダーをコピーする

質問 2: 傷害を受けたとき、自動車に乗っていましたか。または、自動車の近くにいましたか。

いいえ、 ハイイログマが襲ってきたとき、子供たちはスクールバスから無事降りていました。

ファイルが存在することを確認したので、このファイルを別の場所へ移動する方法を紹介しましょう。まず、あるフォルダーから別のフォルダーにファイルをコピーします。C:\scipts フォルダーから C:\scripts\temp フォルダーに test.txt をコピーするスクリプトを次に示します。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("C:\scripts\test.txt")

objFile.Copy "C:\scripts\temp\"

そんなに多くないですよね。まず、FileSystemObject オブジェクトへの参照を作成し、GetFile メソッドを呼び出して、コピーするファイルへの参照を取得します。GetFile メソッドにはパラメーターを 1 つ渡しますが、便利なことに、このパラメーターはコピーするファイルのパスになります。

Set objFile = objFSO.GetFile("C:\scripts\test.txt")

最後に、ファイル オブジェクトで Copy メソッドを呼び出して、ファイルをコピーする場所のパスを渡します。

objFile.Copy "C:\scripts\temp\"

ちなみに、Copy メソッドにはもう 1 つパラメーターを渡せます。このパラメーターを使用して、同じ名前のファイルがコピー先フォルダーに既に存在する場合、ファイルを上書きするかどうかを指定します。既定値は True、つまりファイルを上書きします。既存のファイルを上書きしない場合は、Copy メソッドの 2 つ目のパラメーターとして False を渡します。

objFile.Copy "C:\scripts\temp\", False

また、Copy メソッドを使用して、フォルダーの全コンテンツを別のフォルダーにコピーすることもできます。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:\scripts")

objFolder.Copy "C:\temp"

このスクリプトと、先ほど紹介したスクリプトに、大きな違いはありません。ここでも、FileSystemObject オブジェクトへの参照を作成して、今度は GetFile メソッドを呼び出すのではなく、GetFolder メソッドを呼び出し、コンテンツをコピーするフォルダーのパスを渡します。

Set objFolder = objFSO.GetFolder("C:\scripts")

コピーするフォルダーへのオブジェクト参照を作成したら、このオブジェクトを使用して Copy メソッドを呼び出します。

objFolder.Copy "C:\temp"

このコード行では、C:\scripts フォルダーから、すべてのサブフォルダー内のファイルとフォルダーを含む、すべてのファイルとフォルダーを C:\temp フォルダーにコピーします。フォルダーをコピーする際に渡したパス (C:\temp) と、ファイルをコピーする際に渡したパス (C:\scripts\temp\) に、いくつか違いがあることに注目してください。まず、フォルダーをコピーするときは、パスの末尾に円記号 (\) を付けません。また、コピーするフォルダーのサブフォルダーも指定しません。サブフォルダーを指定すると、ファイルを再帰的にコピーするような処理になるので、処理全体がわかりにくくなります。

ファイルのコピーと同様に、フォルダーをコピーするときにも、既存のファイルやフォルダーを上書きするかどうかを指定する、2 つ目のパラメーターを渡せます。

objFolder.Copy "C:\temp", False

False という値は、"既存のファイルとフォルダーを上書きしない" ことを意味します (既定値は True です)。

また、ファイル オブジェクトやフォルダー オブジェクトに接続しなくても、ファイルやフォルダーをコピーすることもできます。FileSystemObject オブジェクトには、ファイルとフォルダーをコピーするの方法が、Copy メソッド以外にも CopyFile および CopyFolder という 2 つのメソッドが用意されています。まずは、CopyFile メソッドを見てみましょう。

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile "C:\scripts\test.txt","C:\scripts\temp\"

そうです。これで全部です。FileSystemObject オブジェクトへの参照を作成してから、CopyFile メソッドを呼び出すだけです。ご覧のとおり、CopyFile メソッドには 2 つのパラメーターを渡しています。1 つはコピーするファイル (C:\scripts\test.txt) で、もう 1 つはファイルをコピーする場所 (C:\scripts\temp\) です。このスクリプトを実行すると、test.txt ファイルは C:\scripts フォルダーに存在したままで、このファイルのコピー (test.txt という名前です) が C:\scripts\temp フォルダーに作成されます (コピー元のファイルとコピー先フォルダーの両方は、存在している必要があります。存在しない場合は、エラーが発生します)。

Copy メソッドと同様に、CopyFile メソッドにも、スクリプトで既存のファイルを上書きするかどうかを指定する追加のパラメーターを渡すことができます。3 つ目のパラメーターに False を指定して、コピーするファイルが指定した場所に既に存在する場合、スクリプトを実行すると次のようなエラーが表示されます。

C:\scripts\test.vbs(2, 1) Microsoft VBScript runtime error: File already exists

CopyFolder メソッドも、まったく同じように機能します。

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFolder "C:\scripts","C:\scriptstest"

ここでも、まず FileSystemObject オブジェクトを作成します。続いて、CopyFolder メソッドを呼び出し、2 つのパラメーターを渡します。1 つはコピーするフォルダー (C:\scripts) で、もう 1 つはコピー先のフォルダー (C:\scriptstest) です。CopyFolder メソッドを使用すると、コピー元のフォルダーから、サブフォルダー内のファイルとフォルダーを含む、すべてのファイルとフォルダーをコピー先の新しいフォルダーにコピーします。コピー先として指定したフォルダーが存在しない場合、CopyFolder メソッドではそのフォルダーを作成します。

CopyFile メソッドと同様に、CopyFolder メソッドにも、True または False を渡せる 3 つ目のパラメーターを設定できます。True は、コピー先のフォルダーが存在する場合、フォルダーを上書きすることを指定し (既定値は True です)、False は上書きしないことを指定します。なぜ Copy メソッドと CopyFile メソッドまたは CopyFolder メソッドを比較して使用したのかというと、CopyFile メソッドと CopyFolder メソッドには、Copy メソッドにない追加の機能があるからです。Copy メソッドでは 1 度に 1 つのファイルまたはフォルダーしかコピーできませんが、CopyFile メソッドと CopyFolder メソッドでは複数のファイルとフォルダーをコピーできます。

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFile "C:\scripts\*.txt","C:\scripts\temp\"

CopyFile メソッドに渡した 1 つ目のパラメーター (C:\scripts\*.txt) に注目してください。特定のファイル名を渡すのではなく、* というワイルドカード文字を使用して、"C:\scripts フォルダーに存在する、.txt という拡張子のすべてのファイル" と指定しました。このスクリプトを実行すると、C:\scripts フォルダーにある、すべての .txt ファイルが C:\scripts\temp フォルダーにコピーされます。フォルダーに関しても、同様の処理を実行できます。

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.CopyFolder "C:\s*","C:\temp"

先ほど説明したように、フォルダーの完全な名前を指定して CopyFolder メソッドを呼び出すと、そのフォルダーのコンテンツが、すべてコピー先のフォルダーにコピーされました。今度は、ワイルドカードを使用して、C: ドライブにある s という文字で始まるフォルダーをすべてコピーするように指定しました (C:\temp をコピー先のフォルダーに指定しました)。ただし、CopyFolder メソッドを使用すると、s という文字で始まる各フォルダーのコンテンツを検出して、そのコンテンツを C:\temp にコピーするのではなく、フォルダー全体をそのままコピーします。たとえば、C:\scripts という名前のフォルダーに、Test.txt および Test2.txt という 2 つのファイルが含まれている場合、先ほどのスクリプトを実行すると、C:\temp フォルダーは次のようになります。

C:\temp
    C:\temp\scripts
        C:\temp\scripts\Test.txt
        C:\temp\scripts\Test2.txt

考えてみると、これは当然のことでしょう。複数ファイルのコンテンツのみコピーすると、C:\temp フォルダーは整理されていないファイルの寄せ集めになります。こうした寄せ集めを好む人は、おそらくいないでしょう。

ページのトップへ

ファイルとフォルダーを移動する

質問 3: この傷害または疾患は、仕事で必要な作業中に負ったものですか。

仕事に対する考え方によります。Scripting Guys は仕事らしいことを何かしたことがあるでしょうか。

このセクションでは多くは説明しません。主な理由としては、皆さんが知る必要がある内容はすべて説明済みだからです。ただし、次の処理については説明していません。ファイルやフォルダーをコピーではなく、移動する必要がある場合は、上記のファイルとフォルダーのコピーの操作を実行しますが、Copy という単語を Move という単語に置き換えます。たとえば、Copy メソッドを使用してファイルをコピーするスクリプトを次に示します。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("C:\scripts\test.txt")

objFile.Copy "C:\scripts\temp\"

このファイルをコピーするのではなく移動する (つまり、C:\scripts フォルダーから test.txt ファイルを削除して、代わりに C:\scripts\temp フォルダーに配置する) のに必要なことは、Copy メソッドを Move メソッドに置き換えるだけです。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("C:\scripts\test.txt")

objFile.Move "C:\scripts\temp\"

確かに、先ほど説明したことは、完全に正しいとは言えません。Move メソッドでは移動して、Copy メソッドではコピーするという明白な事実以外に、2 つのメソッドには把握しておかなければならない大きな違いが 1 つあります。Copy メソッドには、既存のファイルを上書きするかどうかを指定する 2 つ目のパラメーターを渡すことができますが (既定値は True)、Move メソッドには、このようなパラメーターは渡せません。また、それだけではなく、既定の処理 (Move メソッドの場合は唯一の処理) にも違いがあり、動作は正反対になります。test.txt ファイルが既に C:\scripts\temp に存在する場合に先ほど紹介したスクリプトを実行すると、ファイルは移動されず、次のようなエラー メッセージが表示されます。

C:\scripts\test.vbs(4, 1) Microsoft VBScript runtime error: File already exists

MoveFile メソッドと MoveFolder メソッドに関しても同じことが言えます。これらのメソッドには、CopyFile メソッドと CopyFolder メソッドと同じパラメーターを設定できます。ただし、上書きに関するパラメーターは例外で、このパラメーターは MoveFile メソッドと MoveFolder メソッドでは使用できません。その他の点は基本的に同じで、ファイルやフォルダーを指定の場所にコピーするのではなく、移動するだけです。

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.MoveFile "C:\scripts\test.txt","C:\scripts\temp\"

ご覧のとおり、MoveFile メソッドには、移動するファイル (C:\scripts\test.txt) と、ファイルの移動先 (C:\scripts\temp\) を渡します。MoveFolder メソッドも同様です。

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.MoveFolder "C:\scripts","C:\scriptstest"

また、CopyFile メソッドや CopyFolder メソッドと同じように、MoveFile メソッドと MoveFolder メソッドでもワイルドカードを使用して、一度に複数のファイルやフォルダーを指定できます。例を次に示します。

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.MoveFile "C:\scripts\*.txt","C:\scripts\temp\"

このスクリプトでは、.txt という拡張子のすべてのファイルを、C:\scripts フォルダーから C:\scripts\temp フォルダーに移動します。ここで、もう一度、思い出してください。同じ名前のファイルが移動先のフォルダーに存在している場合、ファイルは移動されず、エラーが発生します。

ページのトップへ

ファイルとフォルダーを削除する

質問 4: この件で代位を務める弁護士がいる場合は、名前、住所、および電話番号を教えてください。

代位弁済の手続きにおける弁護士についての質問が、ファイルとフォルダーの削除に関するセクションで話題に上るなんて、おかしいですよね。

信じていただけないかもしれませんが (しかし、信じていただけないということがあるのでしょうか)、ファイルとフォルダーの削除は、ファイルとフォルダーのコピーや移動と同じくらい簡単です。Copy メソッド、CopyFile メソッド、および CopyFolder メソッド、それから Move メソッド、MoveFile メソッド、および MoveFolder メソッドについて紹介しましたが、削除の操作に使用する 3 つのメソッドの名前を当ててみてください。お見事。正解です。Delete メソッド、DeleteFile メソッド、および DeleteFolder メソッドです (もちろん、1 つも間違えることなく答えられましたよね)。Delete メソッドを使用すると、特定のファイルまたはフォルダーが削除されます。スクリプトは次のとおりです。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("C:\scripts\temp\test.txt")

objFile.Delete

いつもどおり、まず FileSystemObject オブジェクトを作成します。続いて、C:\scripts\temp\test.txt ファイルへのオブジェクト参照を作成します。このオブジェクトで Delete メソッドを呼び出すと、ファイルは削除されます。簡単ですね。Delete メソッドに何もパラメーターを渡さなかったことにお気付きだと思います。実際のところ、このメソッドには、パラメーターを 1 つ渡すことができます。このパラメーターとして渡せる値は、True または False のいずれかです。Delete メソッドに True を渡すと、ファイルが読み取り専用の場合でも、削除するように指定されます。既定値は False です。つまり、このパラメーターを省略するか、False を渡したときに、削除するファイルが読み取り専用の場合は、エラー メッセージが表示され、ファイルは削除されません。

C:\scripts\test.vbs(4, 1) Microsoft VBScript runtime error: Permission denied

また、フォルダー全体を削除することもできます。この際、フォルダーに含まれるコンテンツもすべて削除されます。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:\scripts\temp")

objFolder.Delete

この場合は、C:\scripts\temp フォルダーへのオブジェクト参照を作成して、このフォルダーを削除するために、このオブジェクトで Delete メソッドを呼び出します。このフォルダー内にファイルやフォルダーが存在する場合は、すべて削除されます。ただし、1 つだけ例外があります。読み取り専用に設定されたファイルまたはフォルダーです。削除するフォルダーにあるファイルやフォルダーが読み取り専用の場合は削除されず、フォルダー自体も削除されません。ただし、すべてのファイルとフォルダーは、すべて削除されるまで、または (次が重要です) スクリプトで読み取り専用のファイルまたはフォルダーが検出されるまで、1 つずつ削除されることに注意してください。読み取り専用のファイルやフォルダーが検出されると、エラーが発生して、スクリプトは停止します。つまり、フォルダーは、フォルダー内に一部のファイルとフォルダーが残ったまま存在することになりますが、フォルダー内にすべてのファイルとフォルダーが残っているわけではありません。これは、1 か 0 かという問題ではありません。Delete メソッドに True を渡すと、読み取り専用のファイルやフォルダーが含まれていても、強制的にすべてのコンテンツを削除できます。

objFolder.Delete True
重要: 単純に On Error Resume Next ステートメントを挿入することで、スクリプトで読み取り専用のファイルやフォルダーを無視し、次のファイルやフォルダーに移動して、削除を続行できるのではないかと考えるかもしれません。しかし、論理的には、そのように考えられるかもしれませんが、残念ながら、このようには機能しません。今回の場合、FileSystemObject オブジェクトでは、完全に On Error Resume Next ステートメントを無視します。つまり、エラーが発生すると、Delete メソッドは停止します。Delete メソッドの呼び出しの後に Wscript.Echo ステートメントなどが続く場合、残りのコードは実行され、エラー メッセージは表示されません。ただし、読み取り専用のファイルが検出された時点までしか、削除は実行されていません。


コピーと移動の場合と同様に、ワイルドカードと、ファイルやフォルダーを指定できるメソッド (この場合は DeleteFile メソッドと DeleteFolder メソッドです) を使用して、複数のファイルとフォルダーを削除できます。DeleteFile メソッドを使用した例を次に示します。

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile "C:\scripts\temp\*.txt"

このスクリプトでは、C:\scipts\temp フォルダーにある .txt という拡張子のファイルをすべて削除します。Delete メソッドと同様に、DeleteFile メソッドにも、読み取り専用のファイルを強制的に削除するかどうかを指定する、追加のパラメーターを渡せます。既定値は False で、読み取り専用のファイルは削除しません。

また、複数のフォルダーを削除する方法を次に示します。

Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFolder "C:\scripts\x*"

このスクリプトでは、C:\scripts フォルダーから、x という文字で始まるフォルダー (およびそのコンテンツ) をすべて削除します。このようなスクリプトや削除を行うすべてのメソッドには注意してください。本当に削除するかどうかを確認する警告は表示されません (信じていただけないかもしれませんが、Windows Vista でも表示されません)。それでは、注意しなければならない理由を説明しましょう。たとえば、次のようなスクリプトを実行するとします。

Set objFSO = CreateObject("Scripting.FileSystemObject")
' objFSO.DeleteFolder "C:\w*"
このコマンドでは、Windows ファイルの一部が削除される可能性があります。次のように True を追加すると、すべて削除されます:
Set objFSO = CreateObject("Scripting.FileSystemObject")
' objFSO.DeleteFolder "C:\w*", True

実際のところ、上記の 2 つのスクリプトでは、DeleteFolder メソッドの呼び出しの前に、コメント マークが付いています。皆さんの中に少しだけ心配性な方がいて、このスクリプトをそのままコピーして実行してから、後で説明を読む可能性があると考えたからです。この場合は、コメント マークを省略していたら、大惨事になっていたことでしょう。コメント マークがなければ、C: ドライブにある w から始まるフォルダー (たとえば、C:\windows など) とそのフォルダーのコンテンツは、読み取り専用だったとしても、このスクリプトによってすべて削除されてしまっていました。

ページのトップへ

日付に基づいてコピーする

質問 5: 傷害、疾患、またはその両方を負った日付と時刻を教えてください。

忍者の攻撃を受けていたときです。

FileSystemObject オブジェクトを使用すると、ファイルやフォルダーに関するさまざまな種類の日付情報を取得するという興味深い処理を実行できます。次のスクリプトでは、ファイルが作成された日付を取得します。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("C:\scripts\test.txt")

Wscript.Echo objFile.DateCreated

このスクリプトの最初の 2 行は、今ではもうすっかりおなじみでしょう。FileSystemObject オブジェクトへの参照を作成して、C:\scripts フォルダーの test.txt ファイルへのオブジェクト参照を作成します。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("C:\scripts\test.txt")

次に、File オブジェクトの DateCreated プロパティを使用して、ファイルが作成された日付をエコーします。

Wscript.Echo objFile.DateCreated

これで、次のような日付と時刻の値が返されます。

3/22/2007 11:07:23 AM

DateLastAccessed プロパティを使用して、ファイルに最後にアクセスした日付を取得することもできます。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("C:\scripts\test.txt")

Wscript.Echo objFile.DateLastAccessed

また、DateLastModified プロパティを参照して、ファイルを最後に編集した日付を取得することもできます。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.GetFile("C:\scripts\test.txt")

Wscript.Echo objFile.DateLastModified

これらのプロパティは、ファイルのプロパティを表示したときに確認できる日付と同じです。

ファイルのプロパティ


この話がどこへ向かっているのかお気付きだと思います。そうです、このような日付を取得すると役に立つので、このプロパティについて聞いてくださってよかったです。このプロパティを使用して何ができるのか、ですって。それでは、C:\scripts フォルダーにある 1 か月以上前に作成されたファイルをすべて C:\scripts\old フォルダーにコピーしてみましょう。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:\scripts")

Set colFiles = objFolder.Files

dtmMonthAgo = DateAdd("m", -1, Now)
 
For Each objFile in colFiles
    If objFile.DateCreated < dtmMonthAgo Then
        objFSO.CopyFile objFile.Path, "C:\scripts\old\"
    End If
Next

このスクリプトでは、まず、FileSystemObject オブジェクトを取得して、C:\scripts フォルダーへのオブジェクト参照を作成します。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:\scripts")

このフォルダー内のすべてのファイルを確認する必要があるので、Files メソッドを使用して、C:\scripts フォルダー内のすべてのファイルのコレクションを取得します。

Set colFiles = objFolder.Files

先月の Sesame Script の記事を読んでいただければ、次の行について理解できるでしょう。1 か月以上前に作成されたファイルをすべて検出する必要があります。つまり、1 か月前の日付を把握する必要があります。これは、DateAdd 関数を使用して確認します。

dtmMonthAgo = DateAdd("m", -1, Now)

DateAdd 関数には、次の 3 つのパラメーターを渡しました。

  • "m": 日付の月の部分に追加する必要があることを指定します。

  • -1: お気付きだと思いますが、1 か月さかのぼる必要があるにもかかわらず、ここでは DateAdd 関数を使用しています。これは、DateSubtract という関数が存在しないからです。しかし問題ありません。必要な作業は、負の値を追加するだけで、このようにすると減算できます。つまり、1 か月さかのぼるには、-1 という負の値を追加します。

  • Now: これは単純に、現在のシステムの日付と時刻を返す VBScript の関数です。

新しい日付 (正確に 1 か月前の日付) が、変数 dtmMonthAgo に格納されます。今度は、ファイルのコレクションを処理します。これには For Each ステートメントを使用します。

For Each objFile in colFiles

つまり、ファイルのコレクションの各ファイルに対して、なんらかの処理を実行します。どのような処理を実行するのかと言うと、次のような処理です。

If objFile.DateCreated < dtmMonthAgo Then
        objFSO.CopyFile objFile.Path, "C:\scripts\old\"
    End If

まずは If ステートメントを配置して、ファイルの DateCreated プロパティと 1 か月前の日付 (変数 dtmMonthAgo の値) を比較します。DateCreated プロパティの値が変数 dtmMonthAgo の値より小さい場合は、ファイルが 1 か月以上前に作成されたことになり、このファイルを C:\scripts\old フォルダーにコピーします。この記事の前半で、CopyFile メソッドについて紹介したときの説明を覚えていますか。覚えていてくださったのですね。でしたら、ここで実行している処理については、既に理解しています。CopyFile メソッドを呼び出して、ファイルの完全パスと (File オブジェクトの Path プロパティ)、ファイルのコピー先フォルダーを渡します。

続いて、ループ処理の先頭に戻って、コレクションの次のファイルを確認します。この処理は、すべてのファイルをループ処理して、1 か月以上前に作成されたファイルがコピーされるまで続行します。

ページのトップへ

ご自由にお使いください

質問 6: この事故には、他に当事者はいますか。

いいえ、他に当事者はいません。

まだ実感が沸かないかもしれませんが、日付に基づいてファイルをコピー、移動、および削除するために必要な操作はすべて紹介しました。1 か月以上前に作成されたファイルをコピーする方法しか説明していないとおっしゃるのですか。厳密に言えば、そのとおりです。ただし、これらの作業に必要な要素はすべて揃っています。コピー、移動、および削除する方法、日付を取得する方法、それからフォルダー内のファイルの一覧を読み取る方法を紹介しました。これ以上何を望むというのでしょうか。

皆さんなら、ご自分で何とかできると思っています。しかし、安心してください。そのために Scripting Guys がいるのですから。ただし、今はもう代位弁済の手続きは終了して、料金を払うところです。また来月お会いしましょう。

エピローグ: ご参考までに、ここで "代位" の正確な定義を紹介しましょう (アメリカ・ヘリテッジ辞典参照)。代位とは、"ある人が他人に代わってその地位に付くこと。特に、法律に基づいて、ある債権者が別の債権者に代わってその地位に付くこと" です。

これで、すっきりしましたよね。

ページのトップへ