VBScriptでファイル圧縮の 1050YENさんのアンサーを元に組んでみました。
( zipファイルを圧縮するプログラムが欲しかったので... )
URLでは zipファイル名は決め打ちですので、コマンドラインから
$CScript.exe CompressZip.vbs compressed1.zip file1.txt ...
と打てば compressed1.zipに...という風に汎用性を持たせるために
コマンドライン引数として受け取るとします。
VBScript
1Option Explicit 2 3 4'################################################# 5' ENTRY-POINT 6'################################################# 7 8Dim fs, sh 9 10Set fs = CreateObject( "Scripting.FileSystemObject" ) 11Set sh = CreateObject( "Shell.Application" ) 12 13WScript.Quit MakeZip( WScript.Arguments ) 14 15 16 17'################################################# 18' 関数: 基本の実行部 19'################################################# 20Private Function MakeZip( params ) 21 ' パラメータチェック 22 If Not CheckParams( params ) Then 23 MakeZip = -1 24 Exit Function 25 End If 26 27 ' ZIPファイル作成メイン 28 If Not CreateZip( WScript.Arguments(0), WScript.Arguments ) Then 29 MakeZip = -3 30 Exit Function 31 End If 32 33 ' ここまで来たら正常終了 34 MakeZip = 0 35End Function 36 37 38 39'################################################# 40' 関数: 引数チェック 41'################################################# 42Private Function CheckParams( params ) 43 If params.Count > 1 Then 44 CheckParams = True 45 Else 46 CheckParams = False 47 End If 48End Function 49 50 51 52'################################################# 53' 関数: 排他制御チェック 54'################################################# 55Private Function IsNoOpen( strZipName ) 56 ' エラー無視 57 On Error Resume Next 58 59 WScript.Sleep 100 60 61 ' ファイルを追加モードで開いて閉じてみる 62 Call fs.OpenTextFile( strZipName, 8, False ).Close 63 64 ' エラーが発生しなければ排他がかかっていない 65 IsNoOpen = CBool( (Err.Number = 0) ) 66End Function 67 68 69 70'################################################# 71' 関数: 引数チェック 72'################################################# 73Private Function CreateZip( strZipName, params ) 74 Dim objZip, strItem, strName, zipItem, i 75 76 ' 書庫ファイルが存在していなければ生成 77 If Not fs.FileExists( strZipName ) Then 78 fs.CreateTextFile( strZipName, False ).Write "PK" & Chr(5) & Chr(6) & String(18, 0) ' テキストファイルを生成する 79 End If 80 81 ' 書庫オブジェクトを取得 82 Set objZip = sh.NameSpace( CStr( strZipName ) ) 83 84 ' For Each strItem In params 85 For i = 1 To params.Count 86 87 ' 名前の取得 88 strName = fs.GetFileName( params(i ) 89 90 ' 同名のファイルが存在していたら削除 91 Set zipItem = objZip.ParseName( strName ) ' <- ここでエラー 92 If Not (zipItem Is Nothing) Then 93 Call zipItem.InvokeVerb( "削除(&D)" ) 94 End If 95 96 ' 書庫への追加 97 zipobj.CopyHere strItem 98 99 ' 書庫が排他状態で開けるまで処理続行 100 Do Until IsNoOpen( strZipName ) 101 Loop 102 Next 103 104 CreateZip = True 105End Function 106
ダイアログは極力 出したくないので、元プログラムには "上書きするかどうか..."みたいなダイアログが出る場合の処理等を省いています。
すると、なぜか コメントの "<- ここでエラー" の行でエラーが出ます。
「objZipが無い」みたいなエラー。
それより前の行で
Set objZip = sh.NameSpace( CStr( strZipName ) )
とやっているし、変数宣言も行っています。
変数名を変更しても同じようなエラー。( もちろんその場合は変数名も違いますが。 )
VBSは不慣れなのでイメージができません...
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。