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


  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
  




yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[vbsguide]
CCBot/2.0 (https://commoncrawl.org/faq/)
19/09/19 09:17:17
InfoBoard Version 1.00 : Language=Perl

BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube