• 締切済み

【VBScript】ファイル整形

以下の流れのプログラムを作成したく、 進めています。 下記コードの続きは、どういった感じで作りこんでいけば、 この操作が実現しますでしょうか。 恐れ入りますが、ご教示いただけますと幸いです。 ・vbsファイルにテキストファイルをドラッグする ・インプットボックスに抽出したい文字列を入力する ・テキストファイルを読み込んで、抽出した文字列を含む行を注した  別名のテキストファイル(末尾に_YYYYMMDDをつける)を生成する Option Explicit Dim intc, strf, strArguments, strInput, strmsgbox intc = 0 If WScript.Arguments.Count = 0 Then WScript.Echo "引数が指定されていません。" Else For Each strArguments In WScript.Arguments intc = intc + 1 strf = strArguments Next If intc > 1 Then MsgBox "2つ以上のファイルが指定されています。" & vbCr _ & "ファイルを指定し直してください。", 48, "Error" Else WScript.Echo strf strInput = InputBox("抽出したい文字列を入力してください。") strmsgbox = MsgBox strInput & "を抽出しました。" & vbCr _ & strInput & "を変換しますか?", 4 + 32 + 0, "確認" End If End If

みんなの回答

回答No.1

ん~~見づらい。 余計な空行があったり、If ~ End If間が長かったり、・・・。 ・vbsファイルにテキストファイルをドラッグする ・インプットボックスに抽出したい文字列を入力する ・テキストファイルを読み込んで、抽出した文字列を含む行を注した?意味不明 ・別名のテキストファイル(末尾に_YYYYMMDDをつける)を生成する ということで考えると大体こんな組立かな?と。 Option Explicit Dim strInput Dim oFS,oFile,oFileNew Dim v,Buf Dim MyPath ,MyName,MyDate,MyExt Const ForReading = 1,ForWriting = 2,ForAppending = 8 'Arguementsチェック If WScript.Arguments.Count <> 1 Then WScript.Echo "引数を必ず一個だけ指定してください。それ以外では機能しません。" WScript.Quit End if '抽出値取得 strInput = InputBox("抽出したい文字列を入力してください。") If strInput= "" Then WScript.Echo "中止します" WScript.quit end if 'ファイル読み込み Set oFS = CreateObject("Scripting.FilesystemObject") Set oFile = oFS.OpenTextFile(WScript.Arguments(0),forReading) Do Until oFile.AtEndofStream v=oFile.ReadLine If Instr(1,v,strInput,vbTextCompare) > 0 Then 'vbBinaryCompare の方かも? Buf = Buf & v & VBCrLf End If Loop oFile.Close If IsEmpty(Buf) Then WScript.Echo "抽出文字列" & StrInput & "はありませんでした" Wscript.quit End If '抽出文字があった場合に新規ファイルにBuf書き込み MyPath = oFS.GetParentFolderName(WScript.Arguments(0)) & "\" MyName = oFS.GetBaseName(WScript.Arguments(0)) 'MyDate = "_" & Replace(FormatDatetime(Date,2),"/","") '環境に依存する可能性があるので下にしました MyDate = "_" & Year(Date) _ & String(2-len(Month(Date)),"0") & Month(Date) _ & String(2-len(Day(Date)),"0") & Day(Date) MyExt = "." & oFS.GetExtensionName(WScript.Arguments(0)) Set oFileNew = oFS.CreateTextFile(MyPath & MyName & MyDate & MyExt) '※既存のファイルがあれば無警告上書き oFileNew.Write Buf oFileNew.Close WScript.Echo "終了しました"

caa29674
質問者

補足

ご丁寧で詳細な回答、有難うございます。 すみません、追加で質問させてください。 InputBoxの処理をOKとキャンセルで分岐させたく、 頂いたコードから以下に修正しました。 strInput = InputBox("抽出したい文字列を入力してください。") If strInput = "" Then If strInput = True Then MsgBox "文字列が入力されていません。" & vbCr _ & "入力し直してください。", 0, "Error" WScript.Quit 8 End If WScript.Quit 8 End If OKなら"文字列が入力~" キャンセルなら何も表示しないで終了させたいですが、 足りない部分はありますでしょうか?

関連するQ&A

  • 【VBScript】文字列抽出&テキスト生成

    QNo.9089814の内容と被ってしまうのですが、 アドバイスいただければと思います。 まず以下のプログラムがあります。 現状kensyo.vbsに任意のテキストファイルをドラッグすると、 そのファイルのフルパスを表示した後、 内容を出力する処理となっています。 途中InputBoxを起動し、抽出したい文字列を入力し、 その文字列を変換します、というMsgBoxを加えています。 MsgBoxで「はい」を選択したら、読み込んだテキストファイルから 文字列が含まれる行のみ別名のテキストファイルに抽出したいと考えています。 テキストファイルを読み込む動作までは出来たのですが、 以降の処理をどうすればいいのか、行き詰ってしまいました。 恐れ入りますが、ご教示いただけますと幸いです。 ================================================== <kensyo.vbs> Option Explicit Dim intc Dim strFile, strArguments, strInput, lonmsgbox, objFSO, objOpen, strText intc = 0 If WScript.Arguments.Count = 0 Then WScript.Echo "引数が指定されていません。" Else For Each strArguments In WScript.Arguments intc = intc + 1 strFile = strArguments Next If intc > 1 Then MsgBox "2つ以上のファイルが指定されています。" & vbCr _ & "ファイルを指定し直してください。", 48, "Error" Else WScript.Echo strFile strInput = InputBox("抽出したい文字列を入力してください。") lonmsgbox = MsgBox (strInput & "を抽出しました。" & vbCr _ & strInput & "を変換しますか?", 4 + 32 + 0, "確認") If lonmsgbox = 6 Then Set objFSO = CreateObject("Scripting.FileSystemObject") Set objOpen = objFSO.OpenTextFile(strFile, 1) Do Until objOpen.AtEndOfStream = True strText = objOpen.ReadAll WScript.echo strText Loop objOpen.Close Set objFSO = Nothing Else MsgBox ("処理を中断します。") End If End If End If ==================================================

  • 【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

  • 【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でテキストファイル内の文字列検索

    初心者です。 テキストファイルを指定し、含まれる文字列を検索し、 結果表示したいと考えております。 色々探して、以下で作成したのですが、 うまく動いてくれません。 出来ましたら、テキストファイルの中の文字列の 一部分を指定して動作させたいと思っております。 どなたかご教示のほど宜しくお願い致します。 ---------------------------------------------------- Set WSHFso = CreateObject("Scripting.FileSystemObject") Set WshShell = WScript.CreateObject("WScript.Shell") Dim strSearchWord Set tmpFile = WSHFso.OpenTextFile("C:\AAA.txt") Do Until tmpFile.AtEndOfStream tmpLine = tmpFile.ReadLine strSearchWord = strSearchWord & tmpLine & vbcrlf Loop Dim SearchWord SearchWord = split(strSearchWord," ") if InStr(SearchWord(ix), "test")<>0 then WScript.Echo " testを含みます。" else WScript.Echo " testを含みません。" end if ----------------------------------------------------

  • VBScriptで困ってます(>_<)

    VBScriptを使って、クイズ的なものを作成しているのですが、 打ち込んだクイズをランダムに表示させられないかと考えました ですが、どのような文字列を打ち込んだら良いか分かりません… 一応、こんな感じで作成しています。 moji = inputbox("クイズの内容","タイトル") if (moji = "ここには正解を") then msgbox("当たっていた場合の表示") else msgbox(moji = "外れていた場合の表示") end if 以下二問目~ という風に作成しています どこにどのようにどのような文字列を打ち込めばよいか(ToT)/~~~ どなたか知恵をお貸しください…

  • VBScriptで引数を認識しない

    自分が利用しているマシンにおいて、 WScriptで引数を認識しなくなってしまいました。 CScriptなら認識します。 また、別のマシンなら特に問題はありません。 例えば以下のようなコード。 If WScript.Arguments.Count >= 1 Then WScript.Echo WScript.Arguments.Item(0) End If 何かファイルをドラッグアンドドロップしたり、 コマンドプロンプトから引数をつけて実行するとその引数が表示される だけのものですが、何も表示されません。 環境はWindowsXP SP2です。 WMIサービスを再起動してみたり、 WMIリポジトリの再構築を行ってみましたが変化はありません。 先週までは動いていたのですが、最近何か設定を変えたような記憶もありません…。 テストを別環境で行えば済むだけなのでそれほど困った状況では ないのですが、どうにも原因がわからずすっきりしないので よろしければどなたかご回答のほど、お願いいたします。

  • Vbscriptエラー

    vbでメッセージBOXを用いてプログラムを起動できるようにしたいのですがエラーが出てしまいます。「インデックスが有効範囲にありません。」 どこが間違っているのでしょうか? ーーーーーーー Dim objWShell Dim a Dim b a = MsgBox (" 「」を利用。"&Chr(13)&Chr(13)&_ "    「」?    "&Chr(13)&Chr(13)&Chr(13)&_ " ---------------------------- "&Chr(13)&_ "  お問い合わせください。" , vbYesNo,"「r」") ' MsgBox vbYes&"="&a If a = vbYes Then Set objWShell = CreateObject("WScript.Shell") b = WScript.Arguments(0) If b = 0 Then objWShell.Run "C:\Windows\System32\notepad.exe" ,vbNormalFocus,False ' End If End If ーーーーー

  • 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

  • 【VBScript】ファイルのPathを表示させる

    初歩ですが、VBScriptの処理で質問させてください。 以下の処理を実現したいと思っています。 ・WScript.Arguments.vbsにファイルをドラッグした際に、 ファイルのPathを表示する ・2つ以上のファイルがドラックされた場合は、 アラームを上げて処理を中断する [WScript.Arguments.vbs] Dim Inti Dim oParam(1) for Inti=0 to 1 Set oParam(Inti) = WScript.Arguments MsgBox oParam(Inti) next このコードですが、他に何を追加すればよろしいでしょうか。 恐れ入りますが、回答いただければ幸いです。

  • vbsのif文で複数条件の判定

    例えば以下である場合、 WScript.echo AAA WScript.echo BBB vbsを実行すると "?"が表示されます。 "OK"が表示されない原因として考えられる事はありますでしょうか If AAA = false Then If BBB = false Then WScript.echo "OK" else WScript.echo "NG" End If else WScript.echo "?" End If

専門家に質問してみよう