• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBSでフォルダ、ファイル作成時のエラーコード)

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

このQ&Aのポイント
  • VBSでフォルダやファイルを作成する際のエラーコードについて疑問があります。objFSO.CreateFolderやobjFSO.CreateTextFileの実行結果を確認すると、Err.Numberに予想とは異なる値がセットされることがわかりました。
  • 具体的には、フォルダが作成される場合はErr.Numberに13が、ファイルが作成される場合はErr.Numberに438が返されます。また、作成したフォルダに対してアクセス権を拒否すると、Err.Numberに70がセットされます。
  • なぜ作成が成功したにも関わらず、Err.Numberに0がセットされないのか、理由が分かりません。情報が記載されている書籍やサイトがあれば教えていただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

こんにちは。 > If objFSO.CreateFolder(strFolderName) Then 「戻り値オブジェクト型のメソッド」 なのに、 「オブジェクトそのものを論理式に組み込んでいる」 という構文上の誤りの結果からくる実行時エラーとして、 > Err.Number = 13 です。 > If objFSO.CreateTextFile(strFileName) Then 同様に > Err.Number = 438 です。 つまり、 メソッドの実行に際してのエラー ではなく 論理値が求められる構文にオブジェクト型を渡していることが 原因のエラー、ということです。 2つの異なるエラーが返る理由は、それぞれのオブジェクト毎に、 「プロパティを省略した場合の既定のプロパティ」が異なるからです。 On Error Resume Next を書くのは、デバッグが済んでから にした方が、この手の混乱はなくなりますので、 一般に進められている工程です。 また、「オブジェクト型を返す」ということについて 強く意識を持って、設計からコーディングするようにしましょう。 ご提示のスクリプトを基に書き換えると下記のような感じでしょうか? それぞれ、...Existsで存否確認済ませてますから、 エラートラップが必要な状況なのか疑問が残りますけれども、、、。 (コメントブロックした部分は、  上述の2つのメソッドの戻り値がオブジェクト型であることを  強調して、確認して貰おうという意図で書き添えたものです。) ' ' ----------------------------------------------------8989589w Option Explicit ' ' ------------------------------------------------------------ Dim objFSO ' Scripting.FileSystemObject 'Dim objFolder ' Scripting.Folder ★fso.CreateFolder の戻り値 'Dim objTextStream ' Scripting.TextStream ★fso.CreateTextFile の戻り値 Const strFolderName = "C:\VBS" Const strFileName = "C:\VBS\test.txt" ' ' ------------------------------------------------------------ On Error Resume Next ' ▼▼▼ Set objFSO = CreateObject("Scripting.FileSystemObject") If Err.Number Then WScript.Echo "FSOオブジェクトを作成できませんでした" ' , Err.Number WScript.Quit 1 End If WScript.Echo "FSOオブジェクトを作成しました" On Error GoTo 0 ' ▲▲▲ ' ' ------------------------------------------------------------ If objFSO.FolderExists(strFolderName) Then WScript.Echo "フォルダが見つかりました" Else WScript.Echo "フォルダが見つかりませんでした" On Error Resume Next ' ▼▼▼ objFSO.CreateFolder strFolderName ' ★ 戻り値オブジェクト型のメソッドです 'Set objFolder = objFSO.CreateFolder(strFolderName) If Err.Number Then WScript.Echo "フォルダを作成できませんでした" ' , Err.Number WScript.Quit 1 End If On Error GoTo 0 ' ▲▲▲ WScript.Echo "フォルダを作成しました" End If ' ' ------------------------------------------------------------ If objFSO.FileExists(strFileName) Then WScript.Echo "ファイルが見つかりました" Else WScript.Echo "ファイルが見つかりませんでした" On Error Resume Next ' ▼▼▼ objFSO.CreateTextFile strFileName ' ★ 戻り値オブジェクト型のメソッドです 'Set objTextStream = objFSO.CreateTextFile(strFileName) If Err.Number Then ' ▲▲▲ WScript.Echo "ファイルを作成できませんでした" ' , Err.Number WScript.Quit 1 End If On Error GoTo 0 WScript.Echo "ファイルを作成しました" End If ' ' ------------------------------------------------------------

その他の回答 (1)

回答No.1

こんにちは 詳しく確認していませんが Microsoftのサイト https://msdn.microsoft.com/ja-jp/library/cc392383.aspx に実行時エラーの表があります。 ここにはゼロの記載がありません。 他のコードについてif文で13や438で判定されているようですが、 これらについても同様に番号の意味を上記サイトの表にて確認してみてください。 Err.Numberで判定しない方が良いのではないでしょうか。 今Windows環境がないので動作確認していませんが Set objFSO = CreateObject("Scripting.FileSystemObject") If IsObject(objFSO) Then WScript.Echo "成功" Else WScript.Echo "失敗。(" & Err.Description & ")" WScript.Quit(1) End If Set objFSO = Nothing のようにエラーで判定しないようにしてはどうでしょう。 以上

noname#242248
質問者

お礼

ありがとうございます。 ファイルがない場合は、作成後に objFSO.FileExists(strFileName)で判定させるようにしました。

関連するQ&A