• 締切済み

vbsでのエラー処理についてレクチャーを

vbsのcopyhere関数でファイルのコピーを行うスクリプトを作成しました。コピー自体は問題なく出来るのですが、コピー元のファイルが存在しなかった場合は何も実行されないまま次の処理へ行ってしまうので、そういう場合にエラー用の処理をさせたいと考えてます。 Errメソッド使えばいいと思うのですがうまくいかなかったのでご教授ください。 試しに作成したvbs----------------------------------------- On Error Resume Next Set objShell = CreateObject("Shell.Application") Set objFolder = objShell.NameSpace(strTargetFolder) 'コピー先フォルダの設定 objFolder.CopyHere strCopyFile , &H10 ' set objShell = Nothing 'コピーが失敗した場合に実行させる。 if Err.Number <> 0 Then MsgBox "インストーラーをコピーできませんでした。","コピーに失敗しました" WScript.Quit end if ↓正常にコピー完了した後の処理 これでは上手くいきませんでした。 どうすればエラー時の処理を追加できるでしょうか?

  • pen123
  • お礼率58% (222/377)

みんなの回答

  • chuchuo
  • ベストアンサー率45% (99/217)
回答No.1

errコードの帰りが0なので処理が実行されないのです。 set objShell = Nothing の次に msgbox err と一行入れて試してください。 0が帰ってくるはずです。 これでは On Error Resume Nextにひっかりません。 こういう場合は FileExists も使えないので 元のフォルダーにいくつファイルが入っているかを 調べて何もない場合に処理を実行する必要があります。 コピー元のフォルダのフォルダオブジェクトをつくって そのオブジェクトのitemsメソッドでフォルダーの中身を取得します。 たとえば strTargetFolderの設定が書かれていないので既知のフォルダーだとして 下記xxxxを入れ替えで Set strOrigFolder = objShell.NameSpace(xxxx) 'コピー元フォルダの設定 Set objFolderItems = strOrigFolder.Items() if objFolderItems.count=0 then 'countでファイルの個数を知る MsgBox "ファイルが存在しませんでした。","コピーに失敗しました" WScript.Quit end if でどうでしょう。 if Err.Number <> 0 Then のスクリプトもエラー時に必要ですので残します。 実際に組んで実行していませんので保証はできません。

関連するQ&A

  • VBSでファイルやフォルダのコピー途中で止まる。

    VBSでファイルやフォルダのコピー途中で止まる。 以前に「コピー中にプログレスバーを表示させるには」http://okwave.jp/qa/q5990703.html ========================================== Const FOF_CREATEPROGRESSDLG = &H0& strTargetFolder = "C:\backup\" Set objShell = CreateObject("Shell.Application") Set objFolder = objShell.NameSpace(strTargetFolder) objFolder.CopyHere "D:*.*", FOF_CREATEPROGRESSDLG ========================================== で教えて頂きました上記スクリプトでコピーはできたのですが、普通では見えない保護されたシステムファイルも丸ごとコピーしようとする見たいで、途中で"System Volume Informationを作成または置き換えできません・・・"エラー表示がされて止まってしまいます。 このようなコピーできないファイルやフォルダを無視するか、指定して除外する方法はありませんでしょうか。 よろしくお願いいたします。

  • VBS 任意の名前でzip内のファイルを解凍したい

    VBSを使ってzipファイルの解凍を行う際に、解凍ファイルを任意の名前にしたいです。 現在以下の内容のvbsでzipファイルを解凍しています。 --------------------------------------------------------------- zippath = "C:\新しいフォルダー\test.zip" savepath = "C:\新しいフォルダー" Set objShell = CreateObject("Shell.Application") Set FilesInZip = objShell.NameSpace(zippath).items Set objFolder = objShell.NameSpace(savepath) If (Not objFolder Is Nothing) Then objFolder.CopyHere FilesInZip, FOF_NOCONFIRMATION + FOF_SILENT End If --------------------------------------------------------------- 解凍自体は上手くいってるのですが、解凍したファイルの名前が統一されていない為、次の処理でスマートにファイルの指定ができません。 このファイル名を、 ・zipファイルと同じ名前(例えば「test.zip」なら「test.xlsx」など)にする。 ・任意の名前で解凍する。 ことは出来ないでしょうか。 ご回答よろしくお願いします

  • VBSでフォルダ、ファイル作成時のエラーコード

    フォルダ、ファイルが存在しないとき、作成するスクリプトをVBSで作成していますが、疑問点があるのでご教示ください。 objFSO.CreateFolder、objFSO.CreateTextFileを実行が、正常に行われた場合、 Err.Numberに0がセットされると思っていましたが、実際は違っていました。 objFSO.CreateFolderでフォルダが作成される場合、Err.Numberに13が返されます。 objFSO.CreateTextFileでファイルが作成される場合、Err.Numberに438が返されます。 このスクリプトを実行後、フォルダ、ファイルが存在しない場合、作成されることも確認しています。 フォルダ作成後、作成されたフォルダに対して、ファイルの作成/データの書き込みのアクセス権を拒否にすると返されるErr.numberに70がセットされることも確認しています。 なぜ、フォルダ、ファイルが作成された場合、0が返されないのかご存知の方がいらっしゃいましたらご教示ください。 また、その情報が記載されている書籍およびサイトがあれば、お教えいただければ、幸いです。 Option Explicit Dim objFSO Dim objFile Const strFolderName = "C:\VBS" Const strFileName = "C:\VBS\test.txt" On Error Resume Next Set objFSO = CreateObject("Scripting.FileSystemObject") If Err.Number = 0 Then WScript.Echo "FSOオブジェクトを作成しました" Else WScript.Echo "FSOオブジェクトを作成できませんでした" WScript.Quit(1) End If If objFSO.FolderExists(strFolderName) Then WScript.Echo "フォルダが見つかりました" Else WScript.Echo "フォルダが見つかりませんでした" If objFSO.CreateFolder(strFolderName) Then If Err.Number = 13 Then WScript.Echo "フォルダを作成しました" Else WScript.Echo "フォルダを作成できませんでした" WScript.Quit(1) End If End If End If If objFSO.FileExists(strFileName) Then WScript.Echo "ファイルが見つかりました" Else Script.Echo "ファイルが見つかりませんでした" If objFSO.CreateTextFile(strFileName) Then If Err.number = 438 Then WScript.Echo "ファイルを作成しました" Else WScript.Echo "ファイルを作成できませんでした" WScript.Quit(1) End If End If End If

  • vbsでZIPファイルを特定のフォルダへ。その1

    http://d.hatena.ne.jp/haradago/20150402/p1 を参考に VBSでZIPファイルを特定のフォルダへ解凍しようとしているところです。 以下の記述の意味がわからないので解説お願いします。 --------------------------------------------------- '解凍するZIPファイル DIR_SOURCE = "C:\Users\a\Desktop\aaa.zip" '解凍先 DIR_DEST = "C:\Users\a\Desktop\解凍先" '定数 Const FOF_SILENT = &H04 '進捗ダイアログを表示しない。 Const FOF_NOCONFIRMATION = &H10 '上書き確認ダイアログを表示しない([すべて上書き]と同じ)。 'オブジェクト生成 Set objShell = CreateObject("Shell.Application") Set FilesInZip = objShell.NameSpace(DIR_SOURCE).items Set objFolder = objShell.NameSpace(DIR_DEST) '解凍 If (Not objFolder Is Nothing) Then objFolder.CopyHere FilesInZip, FOF_NOCONFIRMATION + FOF_SILENT End If msgbox "解凍がおわったよ" ----------------------------------------------------------- 上記のVBSを実行すると デスクトップ上に ある aaa.zip が 解凍先 という名のフォルダのなかに 解凍されます。 「解凍がおわったよ」というメッセージも表示されます。 なぜ動くのかがわからないです。 ------------------------------- 'オブジェクト生成 Set objShell = CreateObject("Shell.Application") Set FilesInZip = objShell.NameSpace(DIR_SOURCE).items Set objFolder = objShell.NameSpace(DIR_DEST) ----------------------------------- の意味がわかりません。  オブジェクト メソッド プロパティ の意味はなんとなく程度です。 動物にたとえるならば、   犬・・・・オブジェクト   メソッド・・・・吠える、走る    プロパティ 犬の重さ 大きさ   という感じです。 Set objShell = CreateObject("Shell.Application") の意味なんですが、 ウィンドウズパソコンに入っているソフトを使うときによく出てくるんですが そうゆうもんだと 思っとけばいいんですかね?  たとえば  Set FilesInZip = objShell.NameSpace(DIR_SOURCE).items Set objFolder = objShell.NameSpace(DIR_DEST) この2行の意味ってなんでしょうか? google で NameSpace vbs で調べてはいるんですが、 さっぱりわからないです。 最終的には  解凍.vbs ってアイコンに 解凍したいzipファイルをドロップしたら、指定するフォルダへ 解凍ファイルを放り込むスクリプトを作ろうとしてます。 

  • VBS

    VBSであるファイルを1行ずつ読み込み、その読み込んだ値を ある別のファイルにリダイレクトしたいのですが、 どのように書けばよいか教えてください。 下記のように、echoでは出すことができるのですが、 ファイルにリダイレクトというのができません。 よろしくお願いします。 ==== sample shell ========================= Option Explicit On Error Resume Next Dim objFSO ' FileSystemObject Dim objFile ' ファイル読み込み用 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") If Err.Number = 0 Then Set objFile = objFSO.OpenTextFile("d:\dr1.txt") If Err.Number = 0 Then Do While objFile.AtEndOfStream <> True WScript.Echo objFile.ReadLine Loop objFile.Close Else WScript.Echo "ファイルオープンエラー: " & Err.Description End If Else WScript.Echo "エラー: " & Err.Description End If Set objFile = Nothing Set objFSO = Nothing ============================================================

  • VBSファイルを定期的に自動実行する方法

    毎日同時刻に下記のVBSファイルを自動実行したいと思います。 タスクスケジューラで実行すると download.exe は起動しますが 表示されたダイアログがアクティブ状態にならないため (タイトルバーが灰色のまま、タスクバーのボタンが点滅)、 文字入力ができないまま、処理が終了してしまいます。 1.ダイアログをアクティブにし、正常に処理を実行させるには   どのように記述すれば良いですか? 2.このVBSファイルをユーザーがログオフされている状態で   実行することは可能ですか? 恐れ入りますが、ご存じの方がおられましたら、ご教示願います。 <環境> Windows 2008 Server R2 standard (64ビット) <D:\aaa.vbs> Set objShell = WScript.CreateObject("WScript.Shell") 'ダウンロードEXEを実行 Set objExec = objShell.Exec("D:\download.exe") WScript.Sleep 1000 objShell.AppActivate(objExec.ProcessID) 'ファイルのダウンロード先を指定し、実行(ENTER) WScript.Sleep 1000 objShell.SendKeys "D:\data.txt~"

  • [WSH] ファイルのコピーができない

    こんにちは。 次のようなスクリプトでFTPフォルダにファイルをコピーしようとしたのですが、カレントフォルダにファイルがコピーされてしまうようです。 どうすれば、FTPフォルダにファイルをコピーできるのでしょうか? var objShell = WScript.CreateObject("Shell.Application"); var objFolder = objShell.NameSpace("ftp://user:password@sitename/directory/"); objFolder.CopyHere("C:\\WINNT\\win.ini"); WScript.Sleep(6000); ※下記のページを参考にさせていただき作成しました。http://homepage3.nifty.com/aya_js/wsh/wsh25.htm

  • Desktopのファイルを別フォルダにコピーしたい

    Desktop上のあるZIPファイル(例;zzz.zip)を別のフォルダ(例;DドライブのFolder1)にコピーして解凍する場合、下記のVBSで実行できると思いますが、これをDesktopの階層が異なる(後述の xxxxx)不特定多数のPCで実施する場合、実行できない場合があります。 このためDesktopの階層が左右されないScriptにしたいのですが、模範Scriptを教えていただけないでしょうか。DesktopPathなどで対応すればできるのでは、と思いますが、なかなかうまくいきません。 使用PCのOSはWindows7(32ビット)です。 '------------------------------------------------------------- DIR_Source = "C:\xxxxx\Desktop\zzz.zip" DIR_Destination = "D:\Folder1" Const FOF_Silent = &H04 Const FOF_NoConfirmation = &H10 Set objShell = CreateObject("Shell.Application") Set FilesInZip = objShell.NameSpace(DIR_Source).items Set objFolder = objShell.NameSpace(DIR_Destination) If (Not objFolder Is Nothing) Then objFolder.CopyHere FilesInZip, FOF_NoConfirmation + FOF_Silent End If

  • BAT+VBSでのファイルZIP化処理が終わらない

    Win7・Win2008環境にて、Windowsバッチ(.bat)から、 引数に対象フォルダ・ZIPファイル作成場所を受け取って フォルダのZIP化を行うVBSスクリプトを作成しています。 下記のスクリプトをsample.vbsで作成しsample.batから実行すると ファイルがZIPファイル内に格納されておりません。(空のZIPファイル) そのため、「★★★」箇所の排他処理の関数を呼び出すようにすると ファイルがZIPファイル内に格納されるようになりましたが、 処理がいつまでも完了しません。 (コマンドプロンプトから直接コマンドライン実行すると正常終了します。) 何か間違ってますでしょうか?(そもそもフォルダのZIP化手順も含め) ご教授ほどよろしくお願い致します。 ■sample.vbs ※okwave用インデントのために全角スペース使用 ' ******************************************************* ' オブジェクト定義 ' ******************************************************* Dim fso Dim subf Dim FileName    ' ファイル名 Dim ArgDam     ' 遡り日数 Dim DifDam     ' 遡り日数との差 Dim FDate      ' ファイル作成日 Dim strTargetFolder ' ZIPファイル作成フォルダ Dim m_objShell Set m_objShell = CreateObject("Shell.Application") Set fso = CreateObject("Scripting.FileSystemObject") intOutRet = 0 ' 引数の取得********************************************* ' 引数/ZIP化対象フォルダ情報を取得 Set subf = fso.GetFolder(WScript.Arguments(0)) ' 引数/ZIPファイルの情報を取得 strTargetFolder = WScript.Arguments(1) ' ZIP化処理********************************************** If CreateZipfile(subf, strTargetFolder) = false Then   intOutRet = 1 End If ' オブジェクト開放 Set fso = Nothing WScript.Quit intOutRet ' ZIPファイルの作成************************************** Private Function CreateZipfile(subf, strTargetFolder)   Dim intFileCnt   Dim idx   On Error Resume Next   intFileCnt = 0   For Each FileName In subf.Files     intFileCnt = intFileCnt + 1   Next   'intFileCnt = intFileCnt - 1   idx = 0   Dim intNumbers() '動的配列を宣言   ReDim intNumbers(intFileCnt)   For Each FileName In subf.Files     intNumbers(idx) = FileName     idx = idx + 1   Next   '書庫ファイル作成   fso.CreateTextFile(strTargetFolder, False).Write "PK" & Chr(5) & Chr(6) & String(18, 0)   '書庫オブジェクト取得   Set l_objZIP = m_objShell.NameSpace(CStr(strTargetFolder))   '圧縮対象ファイルを取得   For Each l_strItem In intNumbers     '書庫に追加     l_objZIP.CopyHere l_strItem     '書庫が排他状態で開けるまで、処理継続・・・・・・・・★★★     Do Until IsNoOpen(l_strItem)     Loop   Next   ' 正常終了   CreateZipfile = True   exit function   On Error Goto 0   ' 異常終了   CreateZipfile = false End Function '排他チェック******************************************** Private Function IsNoOpen(p_strFileName)   'エラー無視   On Error Resume Next   WScript.Sleep 100   'ファイルを追加モードで開く/閉じる   Call fso.OpenTextFile(p_strFileName, 8, false).Close   IsNoOpen = CBool((Err.Number = 0)) End Function ■sample.bat F:\BAT\sample.vbs "F:\LOG" "F:\LOG\sample.zip" exit

  • VBSバックアップ

    バックアップスクリプト(VBS)について教えて下さい。 単純にディレクトリをバックアップするスクリプトは、出来たのですが これに付加機能を与えたいです。 ◆世代管理をしたい。 ◆iniファイルから、バックアップ元と先、管理する世代等の情報を読み込みたい。 <bkup.vbs> Option Explicit Const ForReading = 1 '読み込み Const ForWriting = 2 '書きこみ(上書きモード) Const ForAppending = 8 '書きこみ(追記モード) Dim objFileSys Dim objShell Dim strCopyFrom Dim strCopyTo Dim strToDir Dim strNewDate WScript.echo "バックアップを開始します" Set objFileSys = CreateObject("Scripting.FileSystemObject") Set objShell = CreateObject("WScript.Shell") strNewDate = Year(Now) & _ Right(("0" & CStr(Month(Now)+0)),2) & _ Right(("0" & CStr(Day(Now)+0)),2) strCopyFrom = "C:\vbs" strToDir = "C:\backup" strCopyTo = objFileSys.BuildPath(strToDir,strNewDate) If objFileSys.FolderExists(strCopyTo) = True then WScript.echo "指定のパスには既にディレクトリが存在する為、" & _"バックアップ処理を中断します。" WScript.Quit Else objFileSys.CopyFolder strCopyFrom,strCopyTo WScript.echo "バックアップ処理は正常に完了しました。" End If Set objFileSys = Nothing Set objShell = Nothing 宜しくお願い致します。