質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.40%

  • VBScript

    248questions

    VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

VBSのrobocopyについて

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 326

ionn

score 7

コピー元 ネットワークドライブでZに割り振り
srcDir = "\\200.178.30.210\d
コピー先が
destDir = "\\200.178.30.210\e\test"

robocopyCmd = "robocopy " & srcDir & " " & destDir
Dim wExec 'As WshExec
Set wExec = wsShell.Exec(robocopyCmd)
でコピーを行うとき、"\\200.178.30.210\e\test"のパスが繋がらない時にコマンドプロンプトの黒い画面がずっと出ているのですが、これを強制終了させて、処理を行わせたいのですがどのようにコードを書けばいいか困っています。

教えてください、お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

強制終了を考える前に、robocopyの設定を見直してはいかがでしょうか?
デフォルトでは30秒ごとに100万回リトライといった設定のはずです。


補足:強制終了する場合

今回はrobocopyの設定の変更で問題無いと思いますが、強制終了する方法を示しておきます。

WshScriptExec オブジェクト
Terminate メソッド (WshScriptExec)を使用すると、実行したプロセスを強制終了できます。

出来るのは強制終了だけですので、終了条件は自分で考えて実装する必要があります。

コードにすると以下のようなイメージです。

' ...
Dim wExec 'As WshExec
Set wExec = wsShell.Exec(robocopyCmd)

' 強制終了する時間
Const WAIT_SEC = 5 
Dim endTime
endTime = DateAdd("s", WAIT_SEC, Now) 'WAIT_SEC 秒待機

Const WshRunning = 0, WshFinished = 1, WshFailed = 2
Do
    If wExec.Status <> WshRunning Then
        'If wExec.ExitCode = ~
        WSH.Echo "終了"
        Exit Do
    End If

    If Now > endTime Then
        Call wExec.Terminate
        WSH.Echo "強制終了"
        Exit Do
    End If

    WSH.Sleep 10
Loop

ただし、

Terminate メソッドは最後の手段としてのみ使用します。これは、アプリケーションによっては適切にクリーンアップできない場合があるためです。通常は、プロセスを途中で中断せず、プロセス自身で実行を終了させるようにします。

Terminate メソッド (WshScriptExec)より引用

とあるように最後の手段です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

黒い画面のままなのはrobocopyが処理中だからですね。
VBS側でどうにかしようにもrobocopyの処理が終わるまでどうにもできません。
Execメソッドにはタイムアウトの設定などはないようですので、robocopyの設定をどうにかするしかありません。
ヘルプを見ると再試行オプションでなんとかなりそうですね。

::
:: 再試行オプション:
::
               /R:n :: 失敗したコピーに対する再試行数: 既定値は 1,000,000。
               /W:n :: 再試行と再試行の間の待機時間: 既定値は、30 秒です。

               /REG :: /既定の設定としてレジストリに R:n と /W:n を保存します。

               /TBD :: 共有名が定義されるのを待ちます (再試行エラー 67)。


おそらく/R:0だけ設定すればよいのではと思いますが、他の要因で再試行が必要な場合もあるかもしれませんので、待機時間1秒で30回とかにしておいたほうが安全かもしれません。/R:30 /W:1
そこらへんはご自分の判断でお願いします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • VBScript

    248questions

    VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。