ディレクトリ内のファイルの処理

  FileSystemObject で列挙



カレントディレクトリにログファイルが多数あり、log_file_name.20051212 のようなファイル名を持っています。これは毎日1つだけ作成されるファイルで、これらを一括でひとつひとつ別々のzip 書庫に圧縮する処理を行います。
( 例 : log_file_name.20051212 を access.log にして 20051212.zip 内にカタログ )

1) まず、一覧表示して情報を確認

  
Set objFolder = Fso.GetFolder( WshShell.CurrentDirectory )
Set objFiles = objFolder.Files

strTargetName = "log_file_name"

strFiles = ""
For each objFile in objFiles
	if Fso.GetBaseName( objFile.Name ) = strTargetName then
		' ファイル名(パス無し) -- (a)
		strFiles = strFiles & objFile.Name & vbCrLf
		' 拡張子を除いたファイル名
		strFiles = strFiles & Fso.GetBaseName( objFile.Name ) & vbCrLf
		' 拡張子
		strFiles = strFiles & Fso.GetExtensionName( objFile.Name ) & vbCrLf
		' フルパス
		strFullPath = Fso.GetAbsolutePathName( objFile.Name )
		strFiles = strFiles & strFullPath & vbCrLf
		' パスの最後にあるファイル名 -- (b)
		strFiles = strFiles & Fso.GetFileName( strFullPath ) & vbCrLf
		' (a) と (b) は同じ
	end if
Next

WScript.Echo strFiles
  



  ファイルを access.log として、日付文字列.zip を作成する



2) 各ファイルをいったん access.log というファイルにコピーしてから圧縮します

zip ファイルの圧縮には、コマンドラインアプリの zip.exe (Info-ZIP) を使用します

  
Set objFolder = Fso.GetFolder( WshShell.CurrentDirectory )
Set objFiles = objFolder.Files

strTargetName = "i-seifu.jp-access_log"

For each objFile in objFiles
	if Fso.GetBaseName( objFile.Name ) = strTargetName then
		' ログファイルをコピー
		Call Fso.CopyFile( objFile.Name, "access.log" )
		' 拡張子.zip に access.log をカタログ
		strCommand = "zip.exe -j "
		strCommand = strCommand & Fso.GetExtensionName( objFile.Name )
		strCommand = strCommand & " access.log"
		Call WshShell.Run( strCommand, 0, True )
	end if
Next
  



  空のZIPファイル作成

zip.exe -j アーカイブ名 ファイル名 で作成した zip 書庫を Windows XP で開いてファイルを削除すると以下のようになります

          0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
--------------------------------------------------------------------------
00000000 50 4B 05 06 00 00 00 00 00 00 00 00 00 00 00 00  PK..............
00000010 00 00 00 00 00 00                                ......

504B0506
0000     ディスク情報1
0000     ディスク情報2
0000     エントリされたデータの情報1
0000     エントリされたデータの情報2
00000000 サイズ情報
00000000 データへのオフセット
0000     後続するコメントの長さ

このファイルを作成するには、以下のようにします

  
Set Handle = Fso.CreateTextFile( "empty.zip", True )
EmptyData = Chr(&H50) & Chr(&H4B) & Chr(&H5) & Chr(&H6)
EmptyData = EmptyData & String( 18, Chr(0) )
Handle.Write EmptyData
Handle.Close
  



  不完全な Windows XP の zip 圧縮

指定ディリクトリ内にある全てを zip 圧縮します
但し、空のディレクトリを圧縮しようとするとエラーで止まったり、圧縮処理が非同期なので、呼び出し側が終わらないようにする必要があります。

  
' **********************************************************
' 圧縮フォルダ選択
' **********************************************************
Set objFolder = Shell.BrowseForFolder( 0, "フォルダ選択", 11, 0 )
if objFolder is nothing then
	WScript.Quit
end if
if not objFolder.Self.IsFileSystem then
	WScript.Echo "ファイルシステムではありません"
	WScript.Quit
end if

' **********************************************************
' 空の zip 書庫作成
' **********************************************************
Set Handle = Fso.CreateTextFile( "test.zip", True )
EmptyData = Chr(&H50) & Chr(&H4B) & Chr(&H5) & Chr(&H6)
EmptyData = EmptyData & String( 18, Chr(0) )
Handle.Write EmptyData
Handle.Close

' **********************************************************
' 圧縮
' **********************************************************
strTargetZipFile = WshShell.CurrentDirectory & "\test.zip"
Set objTargetFolder = Shell.NameSpace( strTargetZipFile )

Call objTargetFolder.CopyHere( objFolder.Items(), 0 )

' **********************************************************
' 呼び出し側が待つ
' **********************************************************
MsgBox( "終了" )
  



  特殊フォルダをコピー

3 をコピーするとコントロールパネルのショートカットが作成されます。
また、その場合 Call objThisFolder.CopyHere( objFolder.Items(), 0 ) とすると、
コントロールパネル内のエントリのショートカットが全て作成されます。


  
' お気に入り
Set objFolder = Shell.NameSpace( 6 )
' カレント
Set objThisFolder = Shell.NameSpace( WshShell.CurrentDirectory )

Call objThisFolder.CopyHere( objFolder.Self, 0 )

' クッキー
Set objFolder = Shell.NameSpace( &H21 )
' カレント
Set objThisFolder = Shell.NameSpace( WshShell.CurrentDirectory )

Call objThisFolder.CopyHere( objFolder.Self, 0 )
  



  ごみ箱の中の列挙

プロパティから得るデータと、GetDetailsOf メソッドから得るデータでは微妙に表現が違います。
( 違う場合があります )

また、ゴミ箱では有効では無いと思いますが(試していないので)
NameModifyDate は、データをセットして変更可能です。

※ For 〜 Next と For Each 〜 Next はどちらも同様の結果を取得できます

  
Set objFolder = Shell.NameSpace( "::{645FF040-5081-101B-9F08-00AA002F954E}" )

Set objFolderItems = objFolder.Items()
nCount = objFolderItems.Count

' 列挙1
strData = ""
For i = 0 to nCount - 1

	strData = strData & objFolderItems.Item(i).Name & vbCrLf
	strData = strData & objFolderItems.Item(i).ModifyDate & vbCrLf
	strData = strData & objFolderItems.Item(i).Path & vbCrLf
	strData = strData & objFolderItems.Item(i).Size & vbCrLf
	strData = strData & objFolderItems.Item(i).Type & vbCrLf
	strData = strData & vbCrLf

Next

WScript.Echo strData

' 列挙2
strData = ""
For Each obj In objFolderItems

	strData = strData & objFolder.GetDetailsOf(obj, 0) & vbCrLf
	strData = strData & objFolder.GetDetailsOf(obj, 1) & vbCrLf
	strData = strData & objFolder.GetDetailsOf(obj, 2) & vbCrLf
	strData = strData & objFolder.GetDetailsOf(obj, 3) & vbCrLf
	strData = strData & objFolder.GetDetailsOf(obj, 4) & vbCrLf
	strData = strData & objFolder.GetDetailsOf(obj, -1) & vbCrLf
	strData = strData & vbCrLf

Next

WScript.Echo strData
  

Microsoft へのリンク : Folder Object
Microsoft へのリンク : Folder Item Object




  ディレクトリをごみ箱へ移動

この処理も zip 圧縮と同じく非同期処理です。移動処理なので、移動元が無くなるまで待ちます。

※ ごみ箱の特殊フォルダとしての番号は 10 です ( ssfBITBUCKET = 0xa )。
※ 試していませんが、Shell.NameSpace( 10 ) が使えると思います。

  
Set objFolder = Shell.BrowseForFolder( 0, "フォルダ選択", 11, 0 )
if objFolder is nothing then
	WScript.Quit
end if
if not objFolder.Self.IsFileSystem then
	WScript.Echo "ファイルシステムではありません"
	WScript.Quit
end if

Set objDelFolder = Shell.NameSpace( "::{645FF040-5081-101B-9F08-00AA002F954E}" )

Call objDelFolder.MoveHere( objFolder.Self, 0 )
strPath = objFolder.Self.Path

' 移動元が無くなるまで待つ
Do
	Set obj = Shell.NameSpace( strPath )
	if obj is Nothing then
		Exit Do
	end if
	Set obj = Nothing
	WScript.Sleep 500
Loop
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ