バイナリーファイルの引き算をするvbscript
かなり唐突な感じでこれまでとは毛色の違う記事を書いてみますよwちょっとしたことがありましてファイルの足し算引き算をしたいなと思いまして・・・はいw環境は Windows ですよ足し算っていうのは二つのファイルの単純な結合でよいので以下のような足し算はWindows標準のコマンドで楽勝ですなcopy /B a.gif + b.gif addaAndB.gif引き算はその逆で・・・具体的には・・・片方のファイル(B)のサイズの分をもう片方のファイル(A)の先頭から除去ですなwファイルA:123456789123456789ファイルB:1234だったとしたら、A-B:56789123456789という内容のファイルを得たいですなまぁいろいろな方法があると思いますが・・・・探せば条件を満たすフリーウェアはあるでしょうけど今回は VBScript で作ってみましたよせっかくなのでこちらで公開いたしますよちなみにソースコードが読める方は、一部なんじゃこりゃ?と思われる箇所があると思いますがw楽天ブログにソースコードをベタッと貼ると、不等号記号をタグだと認識してくれちゃってタグ間違いだから保存しませんって怒られちゃったりすることの回避策ですwrem こんな感じで利用してくださいw@echo offecho b.gif ファイルをc.gif ファイルと結合するcopy /B b.gif + c.gif addBandC.gifpauseecho 結合されたファイルからb.gif ファイルを除去して、c.gif を抽出するCscript AdivB.vbs addBandC.gif b.gif /spausepause以下を、AdivB.vbs のファイル名で保存して利用してくださいOption ExplicitFunction ReadMe()Dim HelpMSG1,HelpMSG2HelpMSG1= _"機能:ファイルA から、ファイルBのファイル・サイズの分だけ、先頭から除去したファイルを生成する。" & vbCrLf & _"利用方法: AdivB filenameA filenameB [/s] " & vbCrLf & _" : 第3引数は省略可能。/s を指定するとサイレント・モードとなり一切のメッセージ表示をしません " & vbCrLf & _"" & vbCrLfHelpMSG2= _"備考:AのファイルサイズよりもBのほうが大きい場合の検査だけは組み込んでいますが " & vbCrLf & _"データが一致しているかどうかは検査していません。" & vbCrLf & _"" & vbCrLf & _"このスクリプトは、VBS で記述しているという一点でのみ存在価値があると思っています。" & vbCrLf & _"" & vbCrLf & _"著作権とか気にせず自由に自己責任で利用してください。利用に関しては一切の責任を負いません。" & vbCrLf & _"" & vbCrLf & _"参考文献:http://blog.goo.ne.jp/n-best/e/a564cbd4cb1e904b45d701227ed555a7" ReadMe= HelpMSG1End Function'--------------------------------------'以下メインルーチン'-------------------------------------- 'COM の定数を以下のようにクラスで擬似的に定義してます Dim StreamTypeEnum Dim StreamReadEnum Dim SaveOptionsEnum Call Create_Const_Class() Call Main()Sub HelpMSG(option1) Dim ReadMeMSG ReadMeMSG=ReadMe() ReadMeMSG= "引数の指定が間違っています:(" & option1 & ") " & vbCrLf & vbCrLf & ReadMeMSG WScript.Echo ReadMeMSG WScript.QuitEnd SubSub Main() Dim IsSilentMode Dim args, arg Dim BYTESA,BYTESB Set args = WScript.Arguments If args.Count=0 Or args.Count=1 Then Call HelpMSG(1) End If If args.Count=3 Then if LCase(args(2))="/s" Then IsSilentMode=true Else Call HelpMSG(2) End If End If Dim sourceStreamA Dim sourceStreamB Dim outputStream Dim InputFilenameA Dim InputFilenameB Dim OutputFilename Dim objFS, ret, objFileA, objFileB InputFilenameA = args(0) InputFilenameB = args(01) Set args = nothing Set objFS = CreateObject("Scripting.FileSystemObject") ret = objFS.FileExists(InputFilenameA) If ret Then Set objFileA = objFS.GetFile(InputFilenameA) BYTESA= objFileA.Size if not IsSilentMode then WScript.Echo "A target file is " & InputFilenameA & vbCrLf & "(" & FormatNumber(BYTESA, 0) & " byte)" End if Set objFileA = nothing Else if not IsSilentMode then WScript.Echo "Can not Open A file ." End if WScript.Quit End If ret = objFS.FileExists(InputFilenameB) If ret Then Set objFileB = objFS.GetFile(InputFilenameB) BYTESB= objFileB.Size If int(BYTESA/BYTESB)=0 then if not IsSilentMode then WScript.Echo "A File size is too small. It requires more than B FIle size." End if WScript.Quit End if if not IsSilentMode then WScript.Echo "B target file is " & InputFilenameB & vbCrLf & "(" & FormatNumber(BYTESB, 0) & " byte)" End if Set objFileB = nothing Else if not IsSilentMode then WScript.Echo "Can not Open B file ." End if WScript.Quit End If Set objFS = nothing Set sourceStreamA = CreateObject("ADODB.Stream") sourceStreamA.Type = StreamTypeEnum.adTypeBinary sourceStreamA.Open sourceStreamA.LoadFromFile InputFilenameA sourceStreamA.Position = 0' Set sourceStreamB = CreateObject("ADODB.Stream")' sourceStreamB.Type = StreamTypeEnum.adTypeBinary' sourceStreamB.Open' sourceStreamB.LoadFromFile InputFilenameA' sourceStreamB.Position = 0 Set outputStream = CreateObject("ADODB.Stream") outputStream.Type = 1 outputStream.Open outputStream.Position = 0 '読み捨て sourceStreamA.Read( BYTESB ) OutputFilename = InputFilenameA & "div" & InputFilenameB outputStream.Write sourceStreamA.Read(StreamReadEnum.adReadAll) outputStream.SaveToFile OutputFilename, SaveOptionsEnum.adSaveCreateOverWrite sourceStreamA.Close if not IsSilentMode then WScript.Echo "Executed a Successfully." End ifEnd SubSub Create_Const_Class() set StreamTypeEnum = new clsStreamTypeEnum set StreamReadEnum = new clsStreamReadEnum set SaveOptionsEnum = new clsSaveOptionsEnumEnd SubClass clsStreamTypeEnum'https://msdn.microsoft.com/ja-jp/library/cc389884.aspx public adTypeBinary public adTypeText Sub Class_Initialize() adTypeBinary=1 adTypeText=2 End SubEnd Class Class clsStreamReadEnum'https://msdn.microsoft.com/ja-jp/library/cc389881.aspx public adReadAll public adReadLine Sub Class_Initialize() adReadAll=-1 adReadLine=-2 End SubEnd Class Class clsSaveOptionsEnum'https://msdn.microsoft.com/ja-jp/library/cc389870.aspx public adSaveCreateNotExist public adSaveCreateOverWrite Sub Class_Initialize() adSaveCreateNotExist=1 adSaveCreateOverWrite=2 End SubEnd Class