VBSのrobocopyの戻り値を使い分岐処理をさせたいです。
Dim
1Set Shell = WScript.CreateObject("WScript.Shell") 2Shell.Exec("robocopy c:\test c:\test2")``` 3 4上記のrobocopyを行うとして、if文を使い、戻り値判定をさせる時、 5 6If 変数 = 0 Then 7 8処理 9 10ElseIf 変数 = 8 Then 11 12処理 13 14となり、変数にrobocopyの戻り値を指定すればいいのは分かりますが、 15この変数はどのような文字を入力すればいいのでしょうか? 16 17教えて下さい。お願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
ベストアンサー
Shell.Exec(~
の返り値であるWshExec
オブジェクトのExitCode
プロパティから、実行したプログラムの終了コードを受け取ることができます。
(ExitCodeプロパティに関する公式の文書はパッと出てこないですが…)
参考
関連質問と思われるこちらのコード内の変数で示すと
vba
1If wExec.ExitCode = 0 Then 2 '処理 3ElseIf wExec.ExitCode = 8 Then 4 '処理 5'...
といった形になります
180422追記
コメントに対する返答
まず、コメントされたコードにインデントなどを追加して整形します。
vbscript
1Dim Shell, wExec 2Set Shell = WScript.CreateObject("WScript.Shell") 3Shell.Exec ("robocopy c:\test c:\test2") 4 5Set wExec = WshShell.Exec("%comspec% /c dire") 6 7Function ReadAllFromAny(wExec) 8 If wExec.ExitCode = 0 Then 9 MsgBox "0スキップしました" 10 ElseIf wExec.ExitCode = 1 Then 11 MsgBox "1成功です" 12 ElseIf wExec.ExitCode >= 8 Then 13 MsgBox "8失敗です" 14 End If 15
整形してみれば一目瞭然ですが、Functionプロシージャの定義が終わっていません。
vbscript
1Dim Shell, wExec 2Set Shell = WScript.CreateObject("WScript.Shell") 3Shell.Exec ("robocopy c:\test c:\test2") 4 5Set wExec = WshShell.Exec("%comspec% /c dire") 6 7Function ReadAllFromAny(wExec) 8 If wExec.ExitCode = 0 Then 9 MsgBox "0スキップしました" 10 ElseIf wExec.ExitCode = 1 Then 11 MsgBox "1成功です" 12 ElseIf wExec.ExitCode >= 8 Then 13 MsgBox "8失敗です" 14 End If 15End Function '''追加
これで最低限コンパイルは通りますが、多くの問題が残っています。
動作上問題になる部分だけを挙げると
- 宣言していない変数がある(
WshShell
、Option Explicit があれば自動チェック) - 参照する
wExec
が違う(結果を受け取りたいコマンドは?) wExec
の待機処理が無いReadAllFromAny
を呼び出していない
などがあります。
問題の箇所が多く、それぞれについて指摘して修正するのは手間なので、
今回はざっくり全体を修正したコードを示します。
vbscript
1'https://teratail.com/questions/122953 2Option Explicit 3 4Call RunRoboCopy 5 6Sub RunRoboCopy() 7 8 'コピー元ディレクトリ 9 Dim srcDir 'As String 10 srcDir = "c:\test" 11 12 'コピー先ディレクトリ 13 Dim destDir 'As String 14 destDir = "c:\test2" 15 16 Dim robocopyCmd 'As String 17 robocopyCmd = "robocopy " & srcDir & " " & destDir ''' "robocopy c:\test c:\test2" 18 19 ''' wsShell <- Shell 20 Dim wsShell 'As WshShell 21 Set wsShell = CreateObject("WScript.Shell") 22 23 'robocopy実行 24 Dim wExec 'As WshExec 25 Set wExec = wsShell.Exec(robocopyCmd) 26 27 28 '実行したコマンドが終了するまで待機 29 Const WshRunning = 0, WshFinished = 1, WshFailed = 2 30 Do While wExec.Status = WshRunning 31 WSH.Sleep 10 32 'DoEvents 'for VBA 33 Loop 34 35 If wExec.ExitCode = 0 Then 36 MsgBox "0 スキップしました" 37 ElseIf wExec.ExitCode = 1 Then 38 MsgBox "1 成功です" 39 ElseIf wExec.ExitCode >= 8 Then 40 MsgBox "8 失敗です" 41 Else 42 MsgBox wExec.ExitCode & " メッセージが設定されていません" 43 End If 44 45 Dim result 'As String 46 result = wExec.StdOut.ReadAll 47 48 WSH.Echo result 49 'Debug.Print result 'for VBA 50 51End Sub
180422 追記その2
以下のコードは待機処理(Call WaitWshExec(wExec)
)が有る場合、「1」が表示されますが、待機処理ををコメントアウトすると「0」が表示されます。
vbscript
1Option Explicit 2 3Dim execCmd 'As String 4execCmd = "cmd /c dir & exit /b 1" '何か処理をして1を返す 5 6Dim wExec 'As WshExec 7Set wExec = CreateObject("WScript.Shell").Exec(execCmd) 8 9'待機処理 10Call WaitWshExec(wExec) 11 12WSH.Echo wExec.ExitCode 13 14'WshExecの待機用 15Sub WaitWshExec(wExec) 16 '実行したコマンドが終了するまで待機 17 Const WshRunning = 0, WshFinished = 1, WshFailed = 2 18 Do While wExec.Status = WshRunning 19 WSH.Sleep 10 20 Loop 21End Sub
投稿2018/04/21 14:01
編集2018/04/22 12:07総合スコア2166
0
「robocopyの戻り値」で検索すれば、値のほかに注意点まで解説されてますよ。
投稿2018/04/21 13:42

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/22 06:38
2018/04/22 06:42
2018/04/22 08:38
2018/04/22 11:38
2018/04/22 12:26