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

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

ただいまの
回答率

90.53%

  • VBScript

    221questions

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

VBSのrobocopyの戻り値で分岐処理をさせたいです。

解決済

回答 2

投稿

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

ionn

score 7

VBSのrobocopyの戻り値を使い分岐処理をさせたいです。 

Dim Shell Set Shell = WScript.CreateObject("WScript.Shell") Shell.Exec("robocopy c:\test c:\test2")

上記のrobocopyを行うとして、if文を使い、戻り値判定をさせる時、

If 変数 = 0 Then

処理

ElseIf 変数 = 8 Then

処理

となり、変数にrobocopyの戻り値を指定すればいいのは分かりますが、
この変数はどのような文字を入力すればいいのでしょうか?

教えて下さい。お願いします。 

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

Shell.Exec(~の返り値であるWshExecオブジェクトのExitCodeプロパティから、実行したプログラムの終了コードを受け取ることができます。
(ExitCodeプロパティに関する公式の文書はパッと出てこないですが…)
参考

WshScriptExec オブジェクト
ExitCode プロパティ

関連質問と思われるこちらのコード内の変数で示すと

If wExec.ExitCode = 0 Then
    '処理
ElseIf wExec.ExitCode = 8 Then
    '処理
'...

といった形になります


180422追記
コメントに対する返答

まず、コメントされたコードにインデントなどを追加して整形します。

Dim Shell, wExec
Set Shell = WScript.CreateObject("WScript.Shell")
Shell.Exec ("robocopy c:\test c:\test2")

Set wExec = WshShell.Exec("%comspec% /c dire")

Function ReadAllFromAny(wExec)
    If wExec.ExitCode = 0 Then
        MsgBox "0スキップしました"
    ElseIf wExec.ExitCode = 1 Then
        MsgBox "1成功です"
    ElseIf wExec.ExitCode >= 8 Then
        MsgBox "8失敗です"
    End If

整形してみれば一目瞭然ですが、Functionプロシージャの定義が終わっていません。

Dim Shell, wExec
Set Shell = WScript.CreateObject("WScript.Shell")
Shell.Exec ("robocopy c:\test c:\test2")

Set wExec = WshShell.Exec("%comspec% /c dire")

Function ReadAllFromAny(wExec)
    If wExec.ExitCode = 0 Then
        MsgBox "0スキップしました"
    ElseIf wExec.ExitCode = 1 Then
        MsgBox "1成功です"
    ElseIf wExec.ExitCode >= 8 Then
        MsgBox "8失敗です"
    End If
End Function '''追加

これで最低限コンパイルは通りますが、多くの問題が残っています。

動作上問題になる部分だけを挙げると

  1. 宣言していない変数がある(WshShell、Option Explicit があれば自動チェック)
  2. 参照するwExecが違う(結果を受け取りたいコマンドは?)
  3. wExecの待機処理が無い
  4. ReadAllFromAnyを呼び出していない

などがあります。

問題の箇所が多く、それぞれについて指摘して修正するのは手間なので、
今回はざっくり全体を修正したコードを示します。

'https://teratail.com/questions/122953
Option Explicit

Call RunRoboCopy

Sub RunRoboCopy()

    'コピー元ディレクトリ
    Dim srcDir 'As String
    srcDir = "c:\test"

    'コピー先ディレクトリ
    Dim destDir 'As String
    destDir = "c:\test2"

    Dim robocopyCmd 'As String
    robocopyCmd = "robocopy " & srcDir & " " & destDir ''' "robocopy c:\test c:\test2"

    ''' wsShell <- Shell
    Dim wsShell 'As WshShell
    Set wsShell = CreateObject("WScript.Shell")

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


    '実行したコマンドが終了するまで待機
    Const WshRunning = 0, WshFinished = 1, WshFailed = 2
    Do While wExec.Status = WshRunning
        WSH.Sleep 10
        'DoEvents 'for VBA
    Loop

    If wExec.ExitCode = 0 Then
        MsgBox "0 スキップしました"
    ElseIf wExec.ExitCode = 1 Then
        MsgBox "1 成功です"
    ElseIf wExec.ExitCode >= 8 Then
        MsgBox "8 失敗です"
    Else
        MsgBox wExec.ExitCode & " メッセージが設定されていません"
    End If

    Dim result 'As String
    result = wExec.StdOut.ReadAll

    WSH.Echo result
    'Debug.Print result 'for VBA

End Sub

180422 追記その2

以下のコードは待機処理(Call WaitWshExec(wExec))が有る場合、「1」が表示されますが、待機処理ををコメントアウトすると「0」が表示されます。

Option Explicit

Dim execCmd 'As String
execCmd = "cmd /c dir & exit /b 1" '何か処理をして1を返す

Dim wExec 'As WshExec
Set wExec = CreateObject("WScript.Shell").Exec(execCmd)

'待機処理
Call WaitWshExec(wExec)

WSH.Echo wExec.ExitCode

'WshExecの待機用
Sub WaitWshExec(wExec)
    '実行したコマンドが終了するまで待機
    Const WshRunning = 0, WshFinished = 1, WshFailed = 2
    Do While wExec.Status = WshRunning
        WSH.Sleep 10
    Loop
End Sub

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/22 15:38

    回答ありがとうございます。
    前に質問したのと違う下記のコードでrobocopyを実施していました。

    Dim Shell
    Set Shell = WScript.CreateObject("WScript.Shell")
    Shell.Exec("robocopy c:\test c:\test2")

    なので回答を参考に最終的にこんな感じで仕上げました。

    Dim Shell,wExec
    Set Shell = WScript.CreateObject("WScript.Shell")
    Shell.Exec("robocopy c:\test c:\test2")

    Set wExec = WshShell.Exec("%comspec% /c dire")

    Function ReadAllFromAny(wExec)

    If wExec.ExitCode = 0 Then
    msgbox"0スキップしました"
    ElseIf wExec.ExitCode = 1 Then
    msgbox"1成功です"
    ElseIf wExec.ExitCode >= 8 Then
    msgbox"8失敗です"
    End If

    ただ、これだと
    ---------------------------
    Windows Script Host
    ---------------------------
    行: 16
    文字: 7
    エラー: 'End' がありません。
    コード: 800A03F6
    ソース: Microsoft VBScript コンパイル エラー
    ---------------------------
    とエラーが出てしまいました。End Ifは付けているはずなのに困っています。
    よろしければエラーの修正を教えては頂けないでしょうか?

    キャンセル

  • 2018/04/22 15:42

    訂正します。改行を消していたので正しくは下記の15行が正しいです。
    ---------------------------
    Windows Script Host
    ---------------------------
    行: 15
    文字: 7
    エラー: 'End' がありません。
    コード: 800A03F6
    ソース: Microsoft VBScript コンパイル エラー

    ---------------------------

    キャンセル

  • 2018/04/22 17:38

    コンパイルエラーの箇所および、その他問題の箇所について回答に追記しました

    キャンセル

  • 2018/04/22 20:38

    詳しい回答ありがとうございます。
    上記のコードを使ったら無事に動きました。
    ただ、一つ気になった事があったので質問します。
    待機処理が無いとの事でしたが、これがあるのとないのではどう違うのでしょうか?
    よろしければ教えて頂けませんでしょうか?

    キャンセル

  • 2018/04/22 21:26

    待機処理が無い場合、正しい終了コードを取得できません。
    今回の処理を例にすると、常に「0 スキップしました」が表示されます。

    また、メッセージが表示された段階ではrobocopyが終わっていないため、
    最悪の場合コピーが途中で中断されデータが破損する可能性があります
    (簡単に手元で試した限り最悪の場合はそう起きないみたいですが)

    キャンセル

-1

「robocopyの戻り値」で検索すれば、値のほかに注意点まで解説されてますよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • VBScript

    221questions

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