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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VBScript

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

Q&A

解決済

2回答

11902閲覧

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

ionn

総合スコア13

VBScript

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

0グッド

0クリップ

投稿2018/04/21 13:11

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ページで確認できます。

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

WshScriptExec オブジェクト
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 '''追加

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

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

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

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ionn

2018/04/22 06: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は付けているはずなのに困っています。 よろしければエラーの修正を教えては頂けないでしょうか?
ionn

2018/04/22 06:42

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

2018/04/22 08:38

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

2018/04/22 11:38

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

2018/04/22 12:26

待機処理が無い場合、正しい終了コードを取得できません。 今回の処理を例にすると、常に「0 スキップしました」が表示されます。 また、メッセージが表示された段階ではrobocopyが終わっていないため、 最悪の場合コピーが途中で中断されデータが破損する可能性があります (簡単に手元で試した限り最悪の場合はそう起きないみたいですが)
guest

0

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

投稿2018/04/21 13:42

iruyas

総合スコア1067

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問