• ベストアンサー

BAT戻り値による実行(VBS)

再度の質問となります。よろしくお願い致します。 入力ファイルに記述のDir/Fileを全て、別ドライブにコピー処理を行いたいのですが、このまま実行するとバッチファイルのループで埋めつくされてしまいます。(Runメソットの引数無の状態) Sleepを入れずに、BATファイルのコマンド実行結果より、順次、バッチファイルを実行するには、どのように行えばよいのでしょうか。 ちなみに、Runメソットの引数、trueを入れてみたのですが、”引用の括りに問題があるのか、エラーとなります。(trueを外すとうまく動きますが、バッチファイルの複数実行状態が、これでは回避できません。) 何方か、コマンド実行結果より、VBSより順次バッチファイルを実行する方法を教えて頂けませんでしょうか。 VBS------- inFL = objFso.GetAbsolutepathname("tmptest.txt") inBAT = objFso.GetAbsolutepathname("tempcmd.bat") Set objin = objFso.OpenTextFile(inFL,1) dra = "C:" drb = "E:" Do While objin.AtEndOfStream <> True inline = objin.readLine aa = dra &inline bb = drb &inline objWsh.Run(inBAT &" " &aa &" " &bb,1,true) <=== Loop BAT---------- echo F|xcopy /Y %1 %2 inFile------- \temp\a.txt \temp\work\b.txt ~ よろしくお願い致します。

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

  • ベストアンサー
  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.3

#2です。 Do if inline = "" then inline = objin.readLine aa = dra &inline bb = drb &inline objWsh.Run(inBAT &" " &aa &" " &bb,1,true) <=== elseif (drb & inline存在確認) then inline = objin.readLine aa = dra &inline bb = drb &inline objWsh.Run(inBAT &" " &aa &" " &bb,1,true) <=== end if Loop 存在確認できるまで次のRunメソッドも実行しないような処理をイメージしたんですが認識あってますか? 戻り値で判断できるならそっちの方が確実ですからこの話はおしまいです。 おそらく他に応用を効かせたいのでしょうから、質問に対する 本質的な答えではありませんが、コピーするだけなら他の方法として以下の方法もあると思います。 デバッグしてないので 1.自前でコピーする Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Do While objin.AtEndOfStream <> True inline = objin.readLine 'フォルダの存在確認 If objFSO.FolderExists(dra &inline) = True Then 'フォルダなのでフォルダコピー objFSO.CopyFolder dra &inline, drb &inline, True else 'フォルダでないのでファイルコピーする objFSO.CopyFile dra &inline, drb &inline, True endif Loop 2.自分で一時的なbatファイルを作ってしまう ファイル作成 オブジェクト.OpenTextFileかな? Do While objin.AtEndOfStream <> True inline = objin.readLine オブジェクト.WriteLIne("echo F|xcopy /Y " & dra &inline & " " & drb &inline) Loop オブジェクト.close objWsh.Run(作ったファイル) ただこの方法だと作ったバッチを後で消さないといけませんね。 長々と失礼しました。

fwiv3867
質問者

お礼

kenpon24さん回答頂き有難うございます。 存在確認できるまで次のRunメソッドも実行しないような処理をイメージしたんですが認識あってますか? →はい、まさしくその通りです。 コピーするだけなら他の方法として以下の方法もあると思います。 →BATを使わずVBSだけで出来たのですね。ファイルの存在確認が、フォルダorファイルかの判断だったのですね。 未熟な為、思いつきませんでした。すみません。 とても参考になりました。二日に渡ってお付き合い頂き、有難うございました。

その他の回答 (2)

  • kenpon24
  • ベストアンサー率64% (66/102)
回答No.2

drb &inlineにファイルコピーしたいのでしょうから、 inlineに何か値が入っているときは、drb & inlineのファイル存在を確認してからreadLine以下を実行するという条件を入れるというのはどうですか? あまり美しくない処理かもしれませんが。。。

fwiv3867
質問者

お礼

この場合、VBS Loop内で、IF条件を付けFileの存在確認を先に行うので、確かにerrは出ないとは思いますが、繰返し、複数のバッチが並列的に実行されると思われます。 こちらの思いとしては、順次実行させたいと願いますので・・・。 ご回答頂きまして、大変有難うございました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

result = objWsh.Run(inBAT & " " & aa & " " & bb,1,true) 戻り値を受け取る変数を入れてみてください。

fwiv3867
質問者

お礼

すみません、具合が悪く寝込んでいた為、お礼が遅くなりました。 まずは、ご回答頂きまして有難うございます。感謝致します。 ただ、申し訳ありませんが、再度、お教え頂けませんでしょうか。 BATファイルにて copyが正常に終了した場合、VBS BAT共に"0"を返します。 copyが行われない、入力ファイルがない場合(ファイルが見つかりません - 08システム 0 個のファイルをコピーしました)、BATの戻り値は"4"を返しますが、VBSでは"0"となります。 この場合、BATの戻り値をVBSは受取っているのでしょうか? ---cpy元ファイルが無い場合。(BAT xcopy) (1)VBS result = objWsh.Run(inBAT & " " & aa & " " & bb,1,true) msgbox(result) →'0' (2)BAT echo F|xcopy /Y %1 %2 echo %errorlevel% pause →'4'