□技術メモ - VbScript ※管理人の個人的な技術メモです。サンプルソースを実行した結果について 管理人はいかなる責任も負いかねますのでご自身の責任でお試しください。 ----------------------------------------------------------- 〇ファイル処理関連オブジェクトの作成の例 Dim objShell Dim objFso Set objShell=CreateObject("Shell.Application") Set objFso =CreateObject("Scripting.FileSystemObject") 'ここにファイル処理を記述 Set objShell=Nothing Set objFso =Nothing -------- 以下にてvbscriptでzipファイルを作成することを考える。 コマンドは以下を想定する。 C:\work\backup.zipを作成する。 cscript はコマンドラインでvbsを実行するメソッド。 つまりダイアログを表示しないで実行する。 cscript mkzip.vbs backup.zip test1.dat test2.dat ... -------- 〇引数の取得 '引数チェック Dim msgUsage = "以下の形式で実行してください。cscript mkzip.vbs ファイル名.zip ファイル名1 ファイル名2 ..." If WScript.Arguments.Count()<2 Then WScript.Echo msgUsage WScript.Quit End If -------- 〇全ての引数を取得する 〇フォルダObject作成、ファイルObject作成 cscript mkzip.vbs ファイル名.zip ファイル名1 ファイル名2 ... ・上記の形式のうち、ファイル名1 ファイル名2 ... を順番にobjItemに格納する。 Dim i Dim strArg Dim strFullPath Dim strFName Dim strParentFolder Dim objParentFolder Dim objItem for i = 1 to WScript.Arguments.Count() -1 strArg=objFso.GetFileName(WScript.Arguments.Item(i)) strFullPath = objFso.GetAbsolutePathName(strArg) strFName=objFso.GetFileName(strFullPath) ''WScript.Echo strFName strParentFolder = objFso.GetParentFolderName(strFullPath) ''親フォルダの取得 Set objParentFolder = objShell.NameSpace(strParentFolder) Set objItem = objParentFolder.ParseName(strFName) ''フォルダオブジェクトを作成してからファイルオブジェクトを作成する ''ここでファイル処理を行う Set objItem = Nothing Set objParentFolder = Nothing next -------- 〇空のZIPファイルを作成する 〇ZIPをフォルダObjectとして作成する '----基本Object作成 Dim objShell Dim objFso Set objShell = CreateObject("Shell.Application") Set objFso = CreateObject("Scripting.FileSystemObject") '----空のZIPファイル作成 Dim strZipMsg Dim strZipName Dim objZip strZipMsg = "PK" & Chr(5) & Chr(6) & String(18, 0) ''文字の代入はSetは不要 ''VB系の言語はバイナリファイルの処理は得意ではないので、Chr関数を使って処理する。 ''先頭の PK はファイルヘッダらしい。 strZipName = objFso.GetFileName(WScript.Arguments.Item(0)) ''最初の引数がZIPファイル名 Set objZip = objFso.CreateTextFile(strZipName) objZip.Write strZipMsg '----フォルダObjectを作成する Dim objFolder Set objFolder = objShell.NameSpace(objFso.GetAbsolutePathName(strZipName)) ''WScript.Echo objFso.GetAbsolutePathName(strZipName) Set objFolder = Nothing Set objZip = Nothing Set objFso = Nothing Set objShell = Nothing -------- 〇ZIPにファイルを追加する ・フォルダにファイルを追加するのと同じコマンドで良い。 ・フォルダ内のアイテム数を確認することでファイル追加の完了確認を行う。 この処理を外すとアクセス関連のエラーが発生する。 おそらくZIP関連の処理が非同期で走っている。 Dim numOfItem numOfItem = objFolder.Items().Count '追加処理 objFolder.CopyHere objItem '追加完了待ち Do While objFolder.Items().Count=numOfItem WScript.Sleep 100 Loop -------- 〇ZIPファイル作成のサンプル ・以下のコマンドで実行する。 cscriptを外した場合はメッセージダイアログが表示される。 cscript mkzip.vbs ファイル名.zip ファイル名1 ファイル名2 ... ・パラメータチェックや、ファイルの実在チェック等は行っていないので、実行時は注意すること。 -------- mkzip.vbs '----基本Object作成 Dim objShell Dim objFso Set objShell = CreateObject("Shell.Application") Set objFso = CreateObject("Scripting.FileSystemObject") '----空のZIPファイル作成 Dim strZipMsg Dim strZipName strZipMsg = "PK" & Chr(5) & Chr(6) & String(18, 0) ''文字の代入はSetは不要 ''VB系の言語はバイナリファイルの処理は得意ではないので、Chr関数を使って処理する。 ''先頭の PK はファイルヘッダらしい。 strZipName = objFso.GetFileName(WScript.Arguments.Item(0)) ''最初の引数がZIPファイル名 objFso.CreateTextFile(strZipName, False).Write strZipMsg ''True : 上書きする '----ZIPファイルをフォルダObjectとして作成する Dim objFolder WScript.Echo strZipName Set objFolder = objShell.NameSpace(objFso.GetAbsolutePathName(strZipName)) '----すべてのファイルについて実行 Dim i Dim strArg Dim strFullPath Dim strFName Dim strParentFolder Dim objParentFolder Dim objItem for i = 1 to WScript.Arguments.Count() - 1 '----ファイルObjectを作成する strArg=WScript.Arguments.Item(i) strFullPath=objFso.GetAbsolutePathName(strArg) strFName=objFso.GetFileName(strFullPath) strParentFolder=objFso.GetParentFolderName(strFullPath) WScript.Echo strFullPath Set objParentFolder = objShell.NameSpace(strParentFolder) Set objItem = objParentFolder.ParseName(strFName) '----ZIPにファイルを追加する Dim numOfItem numOfItem = objFolder.Items().Count objFolder.CopyHere objItem '----追加完了待ち Do While objFolder.Items().Count=numOfItem WScript.Sleep 500 Loop Set objItem = Nothing Set objParentFolder = Nothing next '----解放 Set objFolder = Nothing Set objFso = Nothing Set objShell = Nothing --------