- PR -

作成から 7 日経過した PDF ファイルをフォルダ (サブフォルダを含む) から削除する方法

1
投稿者投稿内容
DJ517
会議室デビュー日: 2006/09/15
投稿数: 13
投稿日時: 2009-02-19 11:39
- 環境
Windows Server 2000 SP4 (ファイルサーバー)

- 要件
複合機のスキャナ機能からファイルサーバーへ保存される PDF ファイルを 7 日経過後に自動的に削除する。

※PDF ファイルが保存されるファイルサーバーのフォルダは単一ではなく、部署により複数のサブフォルダが存在する。


例:
Scanner (親フォルダ)
|
|- 関東営業本部 (サブフォルダ)
| |
| |- 情報システム部
| xxxxxx1.pdf (自動的に削除したいファイル)
| xxxxxx2.pdf 〃
|
|- 関西営業部 (サブフォルダ)
| |
| |- 営業企画部
| xxxxxx3.pdf (自動的に削除したいファイル)


上記の要件を満たす方法を探しています。

以下のスクリプトを見つけ、対象のファイルを PDF に変更して実行したところ、単一フォルダ内の 7 日経過した PDF ファイルは削除できました。

- Microsoft TechNet
フォルダ内の作成から 7 日を経過したすべての .BAK ファイルを削除する方法はありますか
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/nov06/hey1117.mspx

~~~~~~~~~~~~~~~~~~~~~~~~
dtmDate = Date - 7

strDay = Day(dtmDate)

If Len(strDay) < 2 Then
strDay = "0" & strDay
End If

strMonth = Month(dtmDate)

If Len(strMonth) < 2 Then
strMonth = "0" & strMonth
End If

strYear = Year(dtmDate)

strTargetDate = strYear & strMonth & strDay

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

Set FileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='C:\Scripts'} Where " _
& "ResultClass = CIM_DataFile")

For Each objFile In FileList
strDate = Left(objFile.CreationDate, 8)
If strDate < strTargetDate Then
If objFile.Extension = "bak" Then
objFile.Delete
End If
End If
Next

~~~~~~~~~~~~~~~~~~~~~~~~

このときに指定したフォルダのパスは、以下のとおりです。

\\Fileserver01\Scanner\関東営業本部\情報システム部


要件を満たすためには、フォルダのパスを以下のように親フォルダを指定してスクリプトを実行する必要があります。

\\Fileserver01\Scanner


このようにパスを指定すると Scanner 配下の PDF ファイルは削除されますが、サブフォルダ配下の PDF ファイルは削除されません。(スクリプトにそのような記述がないので当然ですが。。)

スクリプトで削除する対象のフォルダにサブフォルダを含める必要があることは分かったのですが、初心者のためその方法が分かりません。

以下のスクリプトを参考にして、上記のスクリプトにサブディレクトリを含める記述を追記したいのですが、どのように記述をすればよいのか分からず、詳しい方に教えていただきたいと思い投稿させていただきました。

- Microsoft TechNet
フォルダとそのサブフォルダ内のすべての PDF ファイルの一覧を取得する方法はありますか
http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/jun07/hey0608.mspx

~~~~~~~~~~~~~~~~~~~~~~~~
strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

strFolderName = "C:\Test"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.CreateTextFile("C:\Scripts\Test.txt")

Set colSubfolders = objWMIService.ExecQuery _
("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _
& "Where AssocClass = Win32_Subdirectory " _
& "ResultRole = PartComponent")

Set colFiles = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='" & strFolderName & "'} Where " _
& "ResultClass = CIM_DataFile")

For Each objFile in colFiles
If objFile.Extension = "pdf" Then
objTextFile.WriteLine objFile.FileName
End If
Next

For Each objFolder in colSubfolders
GetSubFolders strFolderName
Next

Sub GetSubFolders(strFolderName)

Set colSubfolders2 = objWMIService.ExecQuery _
("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _
& "Where AssocClass = Win32_Subdirectory " _
& "ResultRole = PartComponent")

For Each objFolder2 in colSubfolders2
strFolderName = objFolder2.Name

Set colFiles = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='" & strFolderName & "'} Where " _
& "ResultClass = CIM_DataFile")

For Each objFile in colFiles
If objFile.Extension = "pdf" Then
objTextFile.WriteLine objFile.FileName
End If
Next

GetSubFolders strFolderName
Next
End Sub

~~~~~~~~~~~~~~~~~~~~~~~~

自分でももう少し勉強して調べてみますが、今月中に実現しなければならない要件であり、一人では何もできない状況です。

申し訳ありませんが、ご教示いただければ幸いです。


[ メッセージ編集済み 編集者: DJ517 編集日時 2009-02-19 12:59 ]
IKE
常連さん
会議室デビュー日: 2008/03/24
投稿数: 46
投稿日時: 2009-02-19 13:11
こんにちは。

2つ目のスクリプトに、1つ目のスクリプトの日時判定部分を追加して、
objTextFile.WriteLine objFile.FileName → objFile.delete と
するだけでOKかと。
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-19 13:31
2つ目のスクリプトって冗長な気がするんですが、
これじゃだめなのですかね??


(C:\Test配下のpdfファイル名をc:\test\test.txtに列挙するスクリプト)
コード:
strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

strFolderName = "C:\Test"
strExt = "pdf"


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.CreateTextFile("C:\Test\Test.txt")

GetSubFolders strFolderName


Sub GetSubFolders(strFolderName)

	Set colFiles = objWMIService.ExecQuery _
		("ASSOCIATORS OF {Win32_Directory.Name='" & strFolderName & "'} Where " _
			& "ResultClass = CIM_DataFile")

	For Each objFile in colFiles
		If objFile.Extension = strExt Then
                        ' ファイル名の出力
			'objTextFile.WriteLine objFile.FileName 
			objTextFile.WriteLine objFile.Name 
		End If
	Next
	
	
    Set colSubfolders2 = objWMIService.ExecQuery _
        ("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _
            & "Where AssocClass = Win32_Subdirectory " _
                & "ResultRole = PartComponent")

    For Each objFolder2 in colSubfolders2
        strFolderName = objFolder2.Name
		GetSubFolders strFolderName
    Next
End Sub




IKE さんのおっしゃるように、私も2つ目に日付判定を移植したほうがらくだと思います。
(2つ目はテキストファイルも出力してるので、その辺も注意が必要ですが)
DJ517
会議室デビュー日: 2006/09/15
投稿数: 13
投稿日時: 2009-02-19 15:15
IKE さん、デューンさん

ご返答ありがとうございます。

ご指示いただいたとおりに 2 つ目のスクリプトに日時判定部分を追記したところ、無事にサブフォルダの PDF ファイルも削除することができました!

お忙しいところ本当にありがとうございました!

なお、スクリプトは最終的に以下のように記述しました。

コード:

dtmDate = Date - 7

strDay = Day(dtmDate)

If Len(strDay) < 2 Then
strDay = "0" & strDay
End If

strMonth = Month(dtmDate)

If Len(strMonth) < 2 Then
strMonth = "0" & strMonth
End If

strYear = Year(dtmDate)

strTargetDate = strYear & strMonth & strDay

strComputer = "."

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

strFolderName = "F:\Scanner"

Set colSubfolders = objWMIService.ExecQuery _
("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _
& "Where AssocClass = Win32_Subdirectory " _
& "ResultRole = PartComponent")

Set colFiles = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='" & strFolderName & "'} Where " _
& "ResultClass = CIM_DataFile")

For Each objFile in colFiles
strDate = Left(objFile.CreationDate, 8)
If strDate < strTargetDate Then
If objFile.Extension = "pdf" Then
objFile.Delete
End If
End If
Next

For Each objFolder in colSubfolders
GetSubFolders strFolderName
Next

Sub GetSubFolders(strFolderName)

Set colSubfolders2 = objWMIService.ExecQuery _
("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _
& "Where AssocClass = Win32_Subdirectory " _
& "ResultRole = PartComponent")

For Each objFolder2 in colSubfolders2
strFolderName = objFolder2.Name

Set colFiles = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='" & strFolderName & "'} Where " _
& "ResultClass = CIM_DataFile")

For Each objFile in colFiles
strDate = Left(objFile.CreationDate, 8)
If strDate < strTargetDate Then
If objFile.Extension = "pdf" Then
objFile.Delete
End If
End If
Next

GetSubFolders strFolderName
Next
End Sub




テキストへの出力は必要なかったので 2 つ目のスクリプトの以下の 2 行は削除しました。

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.CreateTextFile("C:\Scripts\Test.txt")

また、strFolderName に UNC を指定するとエラーが発生して実行できなかったため、ドライブからのパスにしました。

スクリプト言語についてはまったくの初心者のため丸二日間試行錯誤していましたが、IKE さん、デューンさんの助言のおかげでなんとか期日までに間に合いそうです。

これを機に WMI や PowerShell の勉強をがんばりたいと思いますので、今後ともよろしくお願いいたします。



[ メッセージ編集済み 編集者: DJ517 編集日時 2009-02-19 15:19 ]
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-19 17:17
おめでとうございます。

引用:

これを機に WMI や PowerShell の勉強をがんばりたいと思いますので、今後ともよろしくお願いいたします。



PowerShellならもっと楽にかけたかも知れませんが、
残念ながらwindows2000では使えないのですよね。

ご存知かもしれませんが補足まで。
1

スキルアップ/キャリアアップ(JOB@IT)