質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

WSH

WSH(Windows Script Host)とは、Windows上でテキストファイルに記述したJavaScriptやVBScriptなどのスクリプトを実行するホスト環境のことです。COMを通じたレジストリ操作やWMIへのアクセスが可能で、複雑な処理も行うことができます。

Q&A

解決済

1回答

5866閲覧

[VBS]なぜだろうか...

BeatStar

総合スコア4958

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

WSH

WSH(Windows Script Host)とは、Windows上でテキストファイルに記述したJavaScriptやVBScriptなどのスクリプトを実行するホスト環境のことです。COMを通じたレジストリ操作やWMIへのアクセスが可能で、複雑な処理も行うことができます。

0グッド

0クリップ

投稿2018/02/17 01:48

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は不慣れなのでイメージができません...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コマンドラインから実行した場合、WSH.Argumentsにはカレントディレクトリからの相対パスが入っていると思います。

Scripting.FileSystemObjectの場合、GetAbsolutePathNameというメソッドがあるように、カレントディレクトリを認識して、絶対パスとなるよう補完して動作しているようです。

しかし、動作を見る限りShell.Applicationはカレントディレクトリを認識せず、NameSpaceメソッドは失敗してもエラーを出さないようです。

この動作を見る限り、引数のパスは一旦絶対パスに変換してから処理した方が無難そうですね。

投稿2018/02/17 03:05

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問