• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フォルダー名の複雑な変更 (2))

フォルダー名の複雑な変更についての質問

このQ&Aのポイント
  • フォルダー名を変更する際にエラーが発生する場合、修正方法を教えてください。
  • 以下のフォルダー名でエラーが出ます: - The Blues Band – The Rooster Crowed(2018) - Sisare – Leaving The Land (2018)
  • watabe007さんから頂いたスクリプトを利用してフォルダー名を変更していますが、一部でエラーが発生しています。修正方法を教えてください。

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

  • ベストアンサー
  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.9

Option Explicit Dim f, i, so, wa, x Set so = CreateObject("Scripting.FileSystemObject") Set wa = WScript.Arguments f = "" For i = 0 to wa.Count - 1 x = wa(i) If InStr(x, "?") > 0 Then f = f & x & vbCrLf End If Next Set wa = Nothing Set so = Nothing If f <> "" Then MsgBox(f) Else MsgBox("Nothing!") End If ドラッグ&ドロップしたフォルダ内に「Unicode文字」が存在すると、まとめて、最後に表示します。 以下は、読んでいただかなくても結構です。 今朝、念のため、他のパソコンでも、私の作ったプログラムを実行してみたのですが、やはり問題なく、Unicode文字の「–」が、半角の「-」に置換された上で、フォルダ名もすべて、問題なく変更できました。 ただ、私はパソコンを3台持っているのですが、すべて「Windows10 Pro 64bit」の環境なので、結果が同じなのは、当然なのですが・・・ 何か、質問者と環境が大きく違うのでしょうか?

NuboChan
質問者

お礼

レス感謝します。 海外ローダーに問題のフォルダー(ファイル)をUPして ダウンロードしていただき Prome_Linさんにどこが問題なのかチェックをお願いする文章を 書き込みましたが、okwaveの方で一部を残して削除されたようです。 (文章で残ったのは、後半の部分のみです。) 頂いた「Unicode文字」が存在をチェックするスクリプトでチェックすると エラーが出る下記がやはりだめだと判定されました。   Drowning Steps – The Comfort Of An Endless Pain(2017)Progressive Rock やはり、Unicode文字の「–」が原因のようです。 下記参照下さい。 https://imgur.com/a/6wNmeNm 私のPCの環境は、   windows_10 Pro X64(1803 ver 17134.167) で同じですね。 環境の違いは、明確にできないので再現性が無く残念です。

NuboChan
質問者

補足

私の環境では、Unicode文字の処理がvbsで上手く処理できないようなので マクロが利用できる『お~瑠璃ね~』でUnicode文字の「–」を、半角の「-」に置換後に Prome_Linさんのスクリプトを利用させていただくようにしました。 数日に渡り貴重なアドバイスをいただき改めて感謝いたします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (8)

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.8

そうなんですか!? こちらで、 The Blues Band – The Rooster Crowed(2018) Sisare – Leaving The Land (2018) Songbirds - 機関車 (1995) jpPop Nodubut - Ten Day(2003) A – Z という5つのフォルダを同じフォルダ内に作成し、上の4つだけをドラッグ&ドロップして、問題なく、4フォルダとも、こちらでは処理できたのですが・・・ また、前回の回答でも、言いましたように、ドラッグ&ドロップしていない「A – Z」も「A - Z」になってしまいました。 私としては、Unicode「–」が、質問者の実際のフォルダでは、違うUnicode文字が使われているとしか、思えないのですが・・・ ん~ん、困りました。

NuboChan
質問者

お礼

何度もすいません。 出来れば、  VBSで上手く処理できないUnicode文字をチェックできる方法があれば教えて下さい。 (Unicode文字を含んでいるフォルダーが特定できるように事前チェックすると    事前に手動で書き換えるとの選択肢も考えられるので)

全文を見る
すると、全ての回答が全文表示されます。
  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.7

私の力不足で申し訳ないのですが、一応の結果は出ました。 最大の問題は、親フォルダをドラッグ&ドロップしたときのプログラムは、 For Each f In gf.SubFolders というように、ドラッグ&ドロップしたフォルダ直下のサブフォルダを調べます。 このやり方でしたら、Unicode文字に対処できたのですが、直接、名前を変更したいフォルダをドラッグ&ドロップするプログラムでは、どうしても、「so.GetFolder()」で、フォルダの取得が出来ないのです。 「For Each f ~」の「f」も「Set f = so.GetFolder()」の「f」も同じ「オブジェクト」なのに・・・ そこでやむを得ず、以下のようにしました。 ドラッグ&ドロップされたすべてのフォルダの親フォルダから、その親フォルダ直下のすべてのサブフォルダの「–」を、半角の「-」に置換してしまってから、もう一度、ドラッグ&ドロップされたフォルダのフォルダ名の変更処理を行っています。 ★★★ このプログラムの最大の問題は、ドラッグ&ドロップしていないフォルダの「–」まで「-」に置換してしまうことです。 しかし、上述のとおり「so.GetFolder()」が使えないため、ドラッグ&ドロップされたフォルダかどうか、特定できないのです。 もし、それでも問題がなければ、お使いください。 Option Explicit Dim c, f, gf, i, n(), p, p1, p2, so, wa, x Set so = CreateObject("Scripting.FileSystemObject") Set wa = WScript.Arguments c = wa.Count - 1 ReDim n(c) For i = 0 to c n(i) = wa(i) n(i) = Replace(n(i), "?", "-") Set gf = so.GetFolder(so.GetParentFolderName(wa(i))) For Each f In gf.SubFolders If InStr(f.Name, "–") > 0 Then f.Name = Replace(f.Name, "–", "-") End If Next Next For i = 0 to c Set f = so.GetFolder(n(i)) p1 = InStr(f.Name, "(") p2 = InStr(f.Name, ")") If p1 > 0 and p2 > 0 and p1 < p2 Then p = Mid(f.Name, p1 + 1, p2 - p1 - 1) & " " & f.Name f.Name = p Set f = Nothing End If Next Set wa = Nothing Set so = Nothing MsgBox("Finished!") 最初に、 For i = 0 to c n(i) = wa(i) n(i) = Replace(n(i), "?", "-") Set gf = so.GetFolder(so.GetParentFolderName(wa(i))) For Each f In gf.SubFolders If InStr(f.Name, "–") > 0 Then f.Name = Replace(f.Name, "–", "-") End If Next Next ドラッグ&ドロップされたフォルダの親フォルダの中のサブフォルダのフォルダ名に含まれる「–」を「-」に置換して、フォルダ名を変更しています。 ここで分かるように、本来は「n(i) = Replace(n(i), "–", "-")」のはずなのに「–」が、「?」となっています。 これが、すべての原因なのですが、私では、どうすることも出来ませんでした。 For i = 0 to c Set f = so.GetFolder(n(i)) p1 = InStr(f.Name, "(") p2 = InStr(f.Name, ")") If p1 > 0 and p2 > 0 and p1 < p2 Then p = Mid(f.Name, p1 + 1, p2 - p1 - 1) & " " & f.Name f.Name = p Set f = Nothing End If Next もう一度、最初から、フォルダ名の変更を行っています。

NuboChan
質問者

お礼

Prome_Linさん、何度も修正のスクリプトありがとうございます。 Unicode文字に対処するには、VBSの仕様で親フォルダーから参照するのが解決の早道なのを理解しました。 今回提供されたコードでサンプルフォルダーでテストしてみました。   Unicode文字が含まれないフォルダーはうまく処理できましたが   Unicode文字を含んだフォルダーは、エラーがでます。      コードが見やすいようにコメントアウトした行を挿入したため、       エラー行24は,問題に挙げられていた         Set f = so.GetFolder(n(i))       になります。   又、   Unicode文字の「–」を半角に変更されるはずなのに変更されていません。   エラーがでるため、それ以降にフォルダーがあっても処理自体がSTOPしてしまいます。     (この結果は、当然なのは十分理解しています。) 心苦しいのですが、どうも意図した処理が上手く行っていないように感じます。

全文を見る
すると、全ての回答が全文表示されます。
  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.6

失礼しました。 「Sisare – Leaving The Land (2018)」などのフォルダ群が存在する直上のフォルダをドラッグ&ドロップする形式に変更しました。 また、「Sisare – Leaving The Land (2018)」の「–」についてだけですが、「-」に置換してからファイル名を変更していますので、Unicode文字「–」だけには対応しました。 Option Explicit Dim f, gf, m, n, p, p1, p2, so, wa Set so = CreateObject("Scripting.FileSystemObject") Set wa = WScript.Arguments If wa.Count <> 1 or so.FolderExists(wa(0)) = False Then MsgBox("ドラッグ&ドロップできるのは、フォルダ1つだけです") WScript.Quit End If Set gf = so.GetFolder(wa(0)) For Each f In gf.SubFolders If InStr(f.Name, "–") > 0 Then Set m = so.GetFolder(gf & "\" & f.Name) m.Name = Replace(f.Name, "–", "-") n = m.Name Set m = Nothing Else n = f.Name End If p1 = InStr(n, "(") p2 = InStr(n, ")") If p1 > 0 and p2 > 0 and p1 < p2 Then p = Mid(n, p1 + 1, p2 - p1 - 1) & " " & n Set m = so.GetFolder(gf & "\" & n) m.Name = p Set m = Nothing End If Next Set gf = Nothing Set wa = Nothing Set so = Nothing MsgBox("Finished!") 簡単な説明です。 If wa.Count <> 1 or so.FolderExists(wa(0)) = False Then ドラッグ&ドロップした「もの」が1つだけか、また、それが「フォルダ」か判定しています。 したがって、ファイルをドラッグ&ドロップした場合には、プログラムは、メッセージを表示して、プログラムそのものを終了してしまいます。 Set gf = so.GetFolder(wa(0)) ドラッグ&ドロップしたフォルダを取得しています。 For Each f In gf.SubFolders ドラッグ&ドロップされたフォルダ直下のサブフォルダをすべて調べます。 If InStr(f.Name, "–") > 0 Then 問題の「–」が含まれていた場合、 Set m = so.GetFolder(gf & "\" & f.Name) m.Name = Replace(f.Name, "–", "-") n = m.Name Set m = Nothing 半角の「-」に置換して、フォルダ名を変更しています。 p1 = InStr(n, "(") p2 = InStr(n, ")") If p1 > 0 and p2 > 0 and p1 < p2 Then p = Mid(n, p1 + 1, p2 - p1 - 1) & " " & n Set m = so.GetFolder(gf & "\" & n) m.Name = p Set m = Nothing ここは、前回と同じですので、説明を省略します。 End If Next を、すべてのサブフォルダで繰り返しています。 Set gf = Nothing Set wa = Nothing Set so = Nothing MsgBox("Finished!") あとは、終了処理で、最後に「Finished!」と表示しています。

NuboChan
質問者

お礼

Prome_Linさん、   こちらこそ早合点で見当外れなクレームを付ける事になり申し訳ありません。 改編いただいたスクリプトをテストすると   フォルダーの先頭に西暦が付加される形式で処理されました。 この時点で「–」が「Unicode文字」のフォルダーをテストの為サンプルに加えていたのですが 「–」(Unicode文字)は、半角の「-」に変換されるはずなのに変換されず元のUnicode文字ままで 処理されています。 (つまり、オリジナルフォルダーの先頭に西暦が付加された形式で変名されました。) ------------------------------ スレッドの流れとしては、   Unicode文字を処理する場合、親フォルダーを利用する処理方法が出まして   そちらの方向で話が進んでいましたが、 私としては、出来れば   変名すべきフォルダーを処理用の親フォルダーに集めずに   改名すべきフォルダーそれぞれをファイラ(ファイルマネージャー)から選択して   デスクトップにある処理用のVBSスクリプト等にドラッグ&ドロップして処理したいのです。      処理時に問題の「–」(Unicode文字)は、半角の「-」に変換されて処理後のフォルダー名にも   反映されれば嬉しいのですが?   これは、VBScriptの仕様のため、無理な相談なのでしょうか?   VBScriptには、こだわらないので他の言語?で処理できれば問題はありません。 ---------------------------------

全文を見る
すると、全ての回答が全文表示されます。
  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.5

??? 私、実際に、 Songbirds - 機関車 (1995) jpPop Nodubut - Ten Day(2003) Sisare - Leaving The Land (2018) The Blues Band - The Rooster Crowed(2018) フォルダを、作成し、この4つのフォルダをプログラムファイルにドラッグ&ドロップした結果、 1995 Songbirds - 機関車 (1995) jpPop 2003 Nodubut - Ten Day(2003) 2018 Sisare - Leaving The Land (2018) 2018 The Blues Band - The Rooster Crowed(2018) になるのを確認してから、回答したのですが?

NuboChan
質問者

お礼

大変失礼しました。 解説文がありながら スレッドの流れで親フォルダー内に全ての処理すべきフォルダーを集めて 親フォルダーをドラッグ&ドロップするものと決めつけてテストしていました。 親フォルダーではなく処理すべきフォルダーからドラッグ&ドロップすると 問題なく処理できました。 「–」が「Unicode文字」の場合は、同じくエラーが出てしまいます。 事前(前処理として)に「–」が「Unicode文字」であれば、通常の半角の「-」に変換してやれば   上手く処理できるなら事前にそのための処理を追加できませんか? 前処理がVBScriptの仕様で処理できないのであれば   親フォルダーに集めて親フォルダーをドラッグ&ドロップする形式を利用する事になりそうです。

全文を見る
すると、全ての回答が全文表示されます。
  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.4

The Blues Band – The Rooster Crowed(2018) Sisare – Leaving The Land (2018) の「–」が「Unicode文字」のため、エラーが出ます。 もし、「–」が通常の半角の「-」であれば、以下の「VBScript」で動きました。 Option Explicit Dim f, i, p, p1, p2, so, wa, x, y Set so = CreateObject("Scripting.FileSystemObject") Set wa = WScript.Arguments For i = 0 to wa.Count - 1 x = so.GetParentFolderName(wa(i)) y = Mid(wa(i), Len(x) + 2) p1 = InStr(y, "(") p2 = InStr(y, ")") If p1 > 0 and p2 > 0 and p1 < p2 Then p = Mid(y, p1 + 1, p2 - p1 - 1) & " " & y Set f = so.GetFolder(wa(i)) f.Name = p Set f = Nothing End If Next Set wa = Nothing Set so = Nothing MsgBox("Finished!") 簡単な説明です。 Option Explicit 「厳密に」とか「明確に」というような意味で、このオプションを設定すると、変数は、その使用の前に、「Dim」等によって宣言しておかなければなりません。 Set so = CreateObject("Scripting.FileSystemObject") ファイルやフォルダを扱えるようにしています。 Set wa = WScript.Arguments ドラッグ&ドロップされるのを待っています。 For i = 0 to wa.Count - 1 ドラッグ&ドロップされたフォルダを1つずつ処理。 x = so.GetParentFolderName(wa(i)) ドラッグ&ドロップされたフォルダが、たとえば「D:\Programming\Songbirds - 機関車 (1995) jpPop」の場合、「D:\Programming」の部分を「x」に入れています。 y = Mid(wa(i), Len(x) + 2) ドラッグ&ドロップされた「Songbirds - 機関車 (1995) jpPop」の部分を「y」に入れています。 すなわち、どのフォルダに存在するか、という部分と、ドラッグ&ドロップされたフォルダ自身の名前を分割しているわけです。 p1 = InStr(y, "(") p2 = InStr(y, ")") 「(」と「)」の位置を調べています。 If p1 > 0 and p2 > 0 and p1 < p2 Then 「(」も「)」も存在して、なおかつ「(」の方が「)」より前に存在すれば、 p = Mid(y, p1 + 1, p2 - p1 - 1) & " " & y 「Mid(y, p1 + 1, p2 - p1 - 1)」の部分で、「1995」という数字の分を取り出しています。 その後ろに「半角スペース+Songbirds - 機関車 (1995) jpPop」としています。 Set f = so.GetFolder(wa(i)) 元のフォルダを取得しています。 f.Name = p 名前を変更しています。 Set f = Nothing 「Set ~」で使った、変数は、その使用後、「Nothing」で解放しておきます。 End If Next を、ドラッグ&ドロップされたフォルダの数だけ繰り返しています。 Set wa = Nothing Set so = Nothing MsgBox("Finished!") あとは、終了処理で、最後に「Finished!」と表示しています。

NuboChan
質問者

お礼

Prome_Linさん、   解説付きのコードの提供ありがとうございます。 サンプルでテストしてみました。   結果、エラーは出ないでMsgBox("Finished!")による完了が表示されましたが 思うような処理が行われずフォルダー名は何も変化が無くオリジナルのままでした。 (watabe007さんのスクリプトでは、ファイル名の変更が行われて書き換わりが行われました。)

全文を見る
すると、全ての回答が全文表示されます。
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

HohoPapa さん、有難うございました。 サブフォルダとして処理してやればいけますね 勉強させていただきました。m(_ _)m Option Explicit Dim arg, ObjFSO, folder, newName, str, n Set objFSO = CreateObject("Scripting.FileSystemObject") For Each arg In WScript.Arguments For Each folder In objFSO.GetFolder(arg).SubFolders newName = GetnewFName(folder.Name) If newName <> "" Then n = n + 1 str = str & "(" & n & ") " & folder.Name & vbCrLf & "↓" & vbCrLf & newName & vbCrLf folder.Name = newName End If Next Next WScript.Echo str & vbCrLf & n & "件、変換できました。" Set objFSO = Nothing Function GetnewFName(strName) Dim objRE, myMatches, strYear Set objRE = CreateObject("VBScript.RegExp") objRE.Pattern = "\(\d{4}\)" Set myMatches = objRE.Execute(strName) If myMatches.Count > 0 Then strYear = Mid(myMatches(0).Value, 2, 4) GetnewFName = strYear & " " & strName If Left(strName, 5) = Left(GetnewFName, 5) Then GetnewFName = "" End If Set objRE = Nothing End Function

NuboChan
質問者

お礼

watabe007さん,改造されたコードありがとうございます。 HohoPapaさんのアドバイスによりwatabe007さんが改造したコードでテストしました。 結果は、問題なく処理されました。 (処置するサンプル数が少ないのでもう少し多くのサンプルでテストする必要はあるかもしれません。)

全文を見る
すると、全ての回答が全文表示されます。
  • HohoPapa
  • ベストアンサー率65% (455/693)
回答No.2

VBSがUniCodeに耐えられないのではなく 処理したいフォルダーをdrag-and-dropするときに (DDEかな?、OLEかも?:ちょっと曖昧) 耐えられないんだろうと思います。 VBSで、かつ、drag-and-drop を生かすのであれば 処理したいフォルダーではなく その親フォルダーをdrag-and-dropする方法で対応するのは いかがでしょうか? むろん、親フォルダーに UniCodeしか持たない文字を使わない前提です。 またせっかく手を加えるので、ついでに、 先頭4文字が数値で、そのあとに半角スペースのあるフォルダーは 対象外にしてみました。 これなら、親フォルダーに対して何度処理しても 子フォルダーは1回しか対象にならないはずです。 Option Explicit Dim args Set args = WScript.Arguments Dim fso set fso = createObject("Scripting.FileSystemObject") Dim F1 Dim F2 Dim subfolder Dim newName For Each F1 in args  Set F2 = fso.getFolder(F1)  for each subfolder in f2.subfolders   newName = GetnewFName(subfolder.name)   If newName <> "" Then    subfolder.Name = newName   End If  next next Function GetnewFName(strName)  Dim objRE  Dim myMatches  Dim strYear  Set objRE = CreateObject("VBScript.RegExp")  objRE.Pattern = "\(\d{4}\)"  Set myMatches = objRE.Execute(strName)  if ((Mid(strName,5,1) <> " ") and _    (IsNumeric(Left(strName,4)) = False) and _    (myMatches.Count > 0)) Then    strYear = Mid(myMatches(0).Value, 2, 4)    GetnewFName = strYear & " " & strName   Set objRE = Nothing  end if End Function

NuboChan
質問者

お礼

HohoPapaさん、レス有難うございます。 HohoPapaさんのアドバイスによりwatabe007が改造したコードでテストしました。 結果は、問題なく処理されました。 (処置するサンプル数が少ないのでもう少し多くのサンプルでテストする必要はあるかもしれません。) しかし、HohoPapaさんのスクリプトでテストすると  申し訳ないのですがHohoPapaさんのスクリプトは、エラーがでました。 添付の画像を参照下さい。 なお、コードにコメントアウトして説明を加えた結果、 28行目は、  Set F2 = fso.getFolder(F1) です。

NuboChan
質問者

補足

>HohoPapaさんのアドバイスによりwatabe007が改造したコードでテストしました。 watabe007さんの誤り。 呼び捨てにするような事になり、大変失礼しました。

全文を見る
すると、全ての回答が全文表示されます。
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

>The Blues Band – The Rooster Crowed(2018) "–" がUnicodeらしくエラーが出たようです。 私自身VBSでUnicodeを扱ったことが無く(^_^;) 他の識者の回答をお待ちください。m(_ _)m

NuboChan
質問者

お礼

watabe007さん、引き続きてのアドバイスありがとうございます。 手詰まりの状態は変わりませんが、  他の方のアドバイスを待ちたいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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

    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でファイル作成後、書き込みできない

    ファイルが存在している場合は、ファイルをオープンして書き込み、ファイルが存在していない場合は、ファイルを作成後、オープンして書き込みを行わせたいと考えています。 しかし、ファイルが存在していないとき、ファイルは作成されるのですが、『エラー:800A0046 書き込みできません。VBScript実行時エラー』が出て、書き込みができません。モードをWritingにしても同じでした。 お手数をおかけしますが、ご教示いただけますようお願いいたします。 Option Explicit '■ オブジェクトの宣言 Dim objFSO Dim objFile '■ 定数の宣言 Const strFileName = "C:\VBS\TEST.TXT" '■ 定数の宣言 '// ファイル入出力モード(8:追加書き込み) Const ForAppending = 8 Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.FileExists(strFileName) Then WScript.Echo "ファイルが見つかりました" Else WScript.Echo "ファイルが見つかりませんでした" Set objFile = objFSO.CreateTextFile(strFileName) If IsObject(objFile) Then WScript.Echo "ファイルを作成しました" Else WScript.Echo "ファイルを作成できませんでした" WScript.Quit(1) End If End If '// ファイルのオープン Set objFile = objFSO.OpenTextFile(strFileName,ForAppending) objFile.WriteLine "2012/12/21,100,ブレーキパッド,35000"

  • 【VBScript】プログラム改良

    VBScriptのプログラムについて、 回答頂きたく投稿しました。 以下を実行すると、 65行目で「'End'がありません。」とエラー表示されてしまいます。 End Ifは入れているはずですが、どこが問題なのでしょうか? またIfステートメントを少し減らしたいのですが、 どうすればシンプルな形になりますでしょうか? 恐れ入りますが、アドバイス頂ければ幸いです。 Option Explicit Dim intCount, strFile, strArg, strX, lonMsgBox, objFSO, objOpen, strText, strNewFile, objTS intCount = 0 If WScript.Arguments.Count = 0 Then WScript.Echo "引数が指定されていません。" WScript.Quit End If For Each strArg In WScript.Arguments intCount = intCount + 1 strFile = strArg Next Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.GetExtensionName(strFile) <> "txt" Then If intCount > 1 Then MsgBox "2つ以上のファイルが指定されています。" & vbCr _ & "ファイルを指定し直してください。", 48, "Error" WScript.Quit Else MsgBox "テキストファイル以外が指定されています。" & vbCr _ & "ファイルを指定し直してください。", 48, "Error" WScript.Quit End If Else strX = InputBox("抽出したい文字列を入力してください。", "変換処理") If strX <> "" Then lonmsgbox = MsgBox (strX & "を抽出します。" & vbCr _ & "変換しますか?", 4 + 32 + 0, "確認") If lonmsgbox = 6 Then strNewFile = objFSO.BuildPath( _ objFSO.GetParentFolderName(strFile), _ objFSO.GetBaseName(strFile) & "_New." & objFSO.GetExtensionName(strFile)) Set objTS = objFSO.OpenTextFile(strNewFile, 2, True) Set objOpen = objFSO.OpenTextFile(strFile, 1) Do Until objOpen.AtEndOfStream = True strText = objOpen.ReadLine If InStr(strText, strX) > 0 Then objTS.WriteLine strText End If Loop objTS.Close Set objTS = Nothing objOpen.Close Set objFSO = Nothing WScript.Sleep 1000 MsgBox ("文字列の抽出が完了しました。") Else MsgBox ("処理を中断します。") End If End If ElseIf IsEmpty(strX) then MsgBox ("キャンセルされました。") WScript.Quit Else MsgBox "文字列が入力されていません。" & vbCr _ & "入力し直してください。", 0, "Error" WScript.Quit End If

  • VBSでルートフォルダ名を取得したい

    (I)ドライブにUSBメモリーがあってルートフォルダ名がABCだとします。 VBSでルートフォルダ名を取得したくてコード書いてみたんですがMsgBoxには空欄しかでません。なにが間違っているのか教えて頂けないでしょうか? dim objFSO dim objDrive Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objDrive = objFSO.GetDrive("I") MsgBox objDrive.RootFolder.name

  • VBScriptで検索結果をタブ表示したいです。

    カレントディレクトリの.txtファイルを1行づつgoogle検索したいのですが、ウィンドウが複数立ち上がってしまい1ウィンドウでタブで表示したいのですが上手くいきません。。と、テキストファイル名もタイトルタグで表示したいです。どなたかご存知でしたらご教授願います。以下、書きかけのソースになります。 ---------------------------------------------------------------------------------- use_ie Sub use_ie() 'Option Explicit 'On Error Resume Next Dim objFSO ' FileSystemObject Dim objFile ' ファイル読み込み用 Dim objWshShell ' WshShell オブジェクト If Err.Number = 0 Then Set objWshShell = WScript.CreateObject("WScript.Shell") Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") If Err.Number = 0 Then For Each FLO In objFSO.GetFolder(objWshShell.CurrentDirectory).Files path = FLO.Path If Right(path, 4) = ".txt" Then Set objFile = objFSO.OpenTextFile(path, 1) Do While objFile.AtEndOfStream <> True Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True 'ie.Navigate "about:blank" 'ie.Document.Write "<title>path</title>" ie.Navigate "http://www.google.co.jp/" ',2048 '新規タブで開く waitIE ie ie.Document.getElementById("q").Value = objFile.ReadLine WScript.Sleep 100 ' 検索ボタンクリック ie.Document.all("btnG").Click waitIE ie strURL = "https://www.google.co.jp/" If ie.LocationURL = strURL Then ie.Quit Set ie = Nothing End If Loop objFile.Close End If Next Else WScript.Echo "ファイルオープンエラー: " & Err.Description End If Else WScript.Echo "エラー: " & Err.Description End If Set objFile = Nothing Set objFSO = Nothing Set objWshShell = Nothing Set ie = Nothing End Sub ' IEがビジー状態の間待ちます Sub waitIE(ie) Do While ie.Busy = True Or ie.readystate <> 4 WScript.Sleep 100 Loop WScript.Sleep 1000 End Sub

  • VBScriptでファイルからgoogle検索

    カレントディレクトリの.txtファイルを1行づつ読み込み、google検索したいのですが、ウィンドウが複数立ち上がってしまい1ウィンドウでタブで表示したいのですが上手くいきません。。と、テキストファイル名もタイトルタグで表示したいです。どなたかご存知でしたらご教授願います。以下、書きかけのソースになります。 ---------------------------------------------------------------------------------- use_ie Sub use_ie() 'Option Explicit 'On Error Resume Next Dim objFSO ' FileSystemObject Dim objFile ' ファイル読み込み用 Dim objWshShell ' WshShell オブジェクト If Err.Number = 0 Then Set objWshShell = WScript.CreateObject("WScript.Shell") Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") If Err.Number = 0 Then For Each FLO In objFSO.GetFolder(objWshShell.CurrentDirectory).Files path = FLO.Path If Right(path, 4) = ".txt" Then Set objFile = objFSO.OpenTextFile(path, 1) Do While objFile.AtEndOfStream <> True Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True 'ie.Navigate "about:blank" 'ie.Document.Write "<title>path</title>" ie.Navigate "http://www.google.co.jp/" ',2048 '新規タブで開く waitIE ie ie.Document.getElementById("q").Value = objFile.ReadLine WScript.Sleep 100 ' 検索ボタンクリック ie.Document.all("btnG").Click waitIE ie strURL = "https://www.google.co.jp/" If ie.LocationURL = strURL Then ie.Quit Set ie = Nothing End If Loop objFile.Close End If Next Else WScript.Echo "ファイルオープンエラー: " & Err.Description End If Else WScript.Echo "エラー: " & Err.Description End If Set objFile = Nothing Set objFSO = Nothing Set objWshShell = Nothing Set ie = Nothing End Sub ' IEがビジー状態の間待ちます Sub waitIE(ie) Do While ie.Busy = True Or ie.readystate <> 4 WScript.Sleep 100 Loop WScript.Sleep 1000 End Sub

  • 【VBScript】文字列変換&抽出

    VBScriptで以下の動作を実現させたいと思っています。 ・vbsファイルにテキストファイルをドラッグする ・InputBoxに任意の文字列を入力する ・変換しますか?と問われるため、 「はい」を押したらTextStreamオブジェクトを1行ごとに読み込む ・見つかった文字列を置換し、その文字列が含まれた全ての行を  別名のテキストファイルに抽出する  例:(ファイルA)    asdfghjk.vbs    1:あいうえお     2:かきくけこ 3:あいうえお ⇒ (ファイルB)    asdfghjk_20151217.vbs    1:をふうえお 2:をふうえお ・「いいえ」を押したら変換しないで別名のテキストファイルに 見つかった文字列が含む行をそのまま抽出する ・見つからなかった場合、何もしない (別名のテキストファイルを作成しない) 前のプログラムだと、文字列が見つからなかった場合でも 空のテキストファイルを作成していました。 これを防ぐために、以下のように修正したのですが、 オブジェクトが存在しない旨のエラーが出て機能してくれません。 どこが問題なのでしょうか? また、次のステップとして、変換処理を加えたいのですが、 InputBoxを再び使用せずに置換することは可能なのでしょうか? 恐れ入りますが、回答いただけますと幸いです。 Option Explicit Const ForReading = 1, ForWriting = 2, ForAppending = 8 Dim objParm, strFile, strX, lonMsgBox Dim objFSO, objOpen, strText, strNewFile, objTS Dim lonDate, v, strBuffer Set objParm = Wscript.Arguments If objParm.Count = 0 Then WScript.Echo "引数が指定されていません。" WScript.Quit ElseIf objParm.Count >= 2 Then WScript.Echo "2つ以上のファイルが指定されています。" WScript.Quit Else strFile = objParm(0) End If Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.GetExtensionName(strFile) <> "txt" Then WScript.Echo objFSO.GetExtensionName(strFile) MsgBox "テキストファイル以外が指定されています。" & vbCr _ & "ファイルを指定し直してください。", vbExclamation, "Error" WScript.Quit End If strX = InputBox("抽出したい文字列を入力してください。", "変換処理") If IsEmpty(strX) Then MsgBox ("キャンセルされました。") WScript.Quit ElseIf strX = "" Then MsgBox "文字列が入力されていません。" & vbCr _ & "入力し直してください。", vbOKOnly, "Error" WScript.Quit End If lonMsgBox = MsgBox(strX & "を抽出します。" & vbCr _ & "変換しますか?", vbYesNo + vbQuestion, "確認") If lonMsgBox <> vbYes Then MsgBox ("変換をスキップします。") End If lonDate = "_" & Year(Now()) & right( "00" & Month(Now()),2) & right( "00" & Day(Now()),2) strNewFile = objFSO.BuildPath( _ objFSO.GetParentFolderName(strFile), _ objFSO.GetBaseName(strFile) & _ lonDate & "." & objFSO.GetExtensionName(strFile)) Set objOpen = objFSO.OpenTextFile(strFile, ForReading) Do Until objOpen.AtEndOfStream = True strText = objOpen.ReadLine v = strText.ReadLine If InStr(v, strX, vbTextCompare) > 0 Then strBuffer = strBuffer & v & VBCrLf End If Loop objOpen.Close Set objOpen = Nothing If IsEmpty(strBuffer) Then MsgBox strX & "が見つかりませんでした。" WScript.Quit End If Set objTS = objFSO.OpenTextFile(strNewFile, ForWriting, True) objTS.WriteLine strBuffer objTS.Close Set objTS = Nothing Set objFSO = Nothing WScript.Sleep 1000 MsgBox ("文字列の抽出が完了しました。")

  • VBSを使用したSQLCMDからのQuit

    VBSを使用してSQLCMDを実行してデータベースに接続できることを確認しましたが、 データベースの切断ができません。 SQLCMDユーティリティに制御が移ってしまっているため、VBSのシェルオブジェクトを使用して切断できないのではと考えております。 ADOを使用すれば、いいのは分かっているのですが、実際の環境ではADOを使用したデータベースへの接続が安定しないため、SQLCMDで接続する方法でスクリプトを作成しました。 何かいい方法がありましたら、ご教示頂けますでしょうか。 Option Explicit '■ オブジェクトの宣言 Dim objFSO Dim objFile Dim objWShell '■ 変数の宣言 Dim strBuf Dim strSearch Dim IngPos Dim IngCnt Dim idx Dim Param(3) Dim Hit Dim HitCnt Dim DBConCmd Dim DisConCmd '■ 定数の宣言 '// データベースコンフィグファイル格納フォルダ Const strDBConfigFolder = "c:\DBConfig" '// データベースコンフィグファイル Const strDBConfigFile = "c:\DBConfig\SQLCMDDBCon.cfg" '// 検索開始位置(1文字目) Const IngStart = 1 '// テキストモードで比較 Const IngTextCmp = 1 On Error Resume Next '□ FSOオブジェクトの作成 Set objFSO = CreateObject("Scripting.FileSystemObject") If Err.Number = 0 Then '□ データベースコンフィグファイル格納フォルダの存在チェック If objFSO.FolderExists(strDBConfigFolder) Then WScript.Echo "データベースコンフィグファイルを格納フォルダが存在します" '□ データベースコンフィグファイルの存在チェック If objFSO.FileExists(strDBConfigFile) Then WScript.Echo "データベースコンフィグファイルが存在します" '□ データベースコンフィグファイルの読み込み Set objFile = objFSO.OpenTextFile(strDBConfigFile, 1) '□ データベースコンフィグファイル読み取りチェック If Err.Number = 0 Then WScript.Echo "データベースコンフィグファイルが読み取りできます" '□ ディレクティブをセット strSearch = Array("<server_name>", "<login_id>", "<password>") '□ ヒットカウントの初期化 HitCnt = 0 Do Until objFile.AtEndOfLine = True '□ 1行読み込み、バッファに格納 strBuf = objFile.ReadLine '□ インデックスの初期化 idx = 0 '□ ヒットフラグの初期化 Hit = 0 '□ ディレクティブヒット判定用の初期化 IngPos = 0 Do Until idx > 2 or Hit = 1 IngPos = Instr(IngStart, strBuf, strSearch(idx), IngTextCmp) If IngPos = 0 Then WScript.Echo strSearch(idx) & "が見つかりません" idx = idx + 1 Else WScript.Echo strSearch(idx) & "が見つかりました" IngCnt = Len(strSearch(idx)) Param(idx) = Mid (strBuf, IngCnt + 1) Hit = 1 HitCnt = HitCnt + 1 End If Loop Loop Else WScript.Echo "データベースコンフィグファイルが読み取りできまないため、処理を終了します" WScript.Quit(1) End If Else WScript.Echo "データベースコンフィグファイルが存在しないため、処理を終了します" WScript.Quit(1) End If Else WScript.Echo "データベースコンフィグファイルを格納フォルダが存在しないため、処理を終了します" WScript.Quit(1) End If Else WScript.Echo "FSOオブジェクトが作成できないため、処理を終了します" WScript.Quit(1) End If '□ Shellオブジェクトの作成 Set objWShell = WScript.CreateObject("WScript.Shell") If Err.Number = 0 Then DBConCmd = "sqlcmd -S " & Param(0) & " -U " & Param(1) & " -P " & Param(2) objWShell.run DBConCmd If Err.Number = 0 Then WScript.Echo "データベースサーバーに接続しました" Else WScript.Echo "データベースサーバーに接続できませんでしたので、処理を終了します" WScript.Quit(1) End If Else WScript.Echo "Shellオブジェクトが作成できないため、処理を終了します" WScript.Quit(1) End If DBDisConCmd = "exit" objWShell.run DBDisConCmd '□ オブジェクトのクローズ objFile.Close '□ オブジェクトの開放 Set objShell = Nothing Set objFSO = Nothing

  • VBScript について 初心者です

    会社内でmsgファイルから添付ファイルを抽出するVBScriptを以下のコードで利用させてもらっています。ただ、同じファイル名の場合は取出すことができません。アンケート.xlsx、アンケート(2).xlsx、などという形でもれなく取出せるようにできないでしょうか?よろしくお願いいたします。 Option Explicit Dim args Dim olApp Dim i Const SaveFolderPath = "C:\Test" '添付ファイルの保存先フォルダ(※要変更) Set args = WScript.Arguments If args.Count < 1 Then MsgBox "msgファイルを当スクリプトファイルにドラッグ&ドロップしてください。", vbExclamation + vbSystemModal WScript.Quit End If With CreateObject("Scripting.FileSystemObject") If .FolderExists(SaveFolderPath) = False Then MsgBox "添付ファイルの保存先フォルダが見つかりませんでした。" & vbCrLf & _ "処理を中止します。", vbCritical + vbSystemModal WScript.Quit End If Set olApp = CreateObject("Outlook.Application") For i = 0 To args.Count - 1 If .FileExists(args(i)) = True Then Select Case LCase(.GetExtensionName(args(i))) Case "msg" 'msgファイルのみ処理 SaveMsgAttachments olApp, args(i), AddPathSeparator(SaveFolderPath) End Select End If Next olApp.Quit End With MsgBox "処理が終了しました。", vbInformation + vbSystemModal Private Sub SaveMsgAttachments(ByVal OutlookApp, ByVal MsgFilePath, ByVal SaveFolderPath) Dim itm 'Outlook.MailItem Dim atc 'Outlook.Attachment Dim fn With OutlookApp.GetNamespace("MAPI") Set itm = .OpenSharedItem(MsgFilePath) Select Case LCase(TypeName(itm)) Case "mailitem" If itm.Attachments.Count < 1 Then MsgBox "添付ファイルがありません。" & vbCrLf & _ "(ファイル名:" & MsgFilePath & ")", vbExclamation + vbSystemModal Exit Sub Else With CreateObject("Scripting.FileSystemObject") For Each atc In itm.Attachments fn = SaveFolderPath & atc.FileName If .FileExists(fn) = True Then .DeleteFile fn, True '同名のファイルがあったら事前に削除 End If atc.SaveAsFile fn Next End With End If End Select End With End Sub Private Function AddPathSeparator(ByVal s) If Right(s, 1) <> ChrW(92) Then s = s & ChrW(92) AddPathSeparator = s End Function

NS710HAW-JにAUX入力はありますか
このQ&Aのポイント
  • NS710HAW-Jには、AUX入力ポートが搭載されていますか
  • NS710HAW-Jでは、AUXケーブルを使用して外部機器を接続することができますか
  • NECのNS710HAW-Jには、AUX入力機能が装備されているか確認したいです
回答を見る