質問するログイン新規登録

回答編集履歴

3

コメントの質問への回答追記

2018/04/22 12:07

投稿

imihito
imihito

スコア2166

answer CHANGED
@@ -127,4 +127,34 @@
127
127
  'Debug.Print result 'for VBA
128
128
 
129
129
  End Sub
130
+ ```
131
+
132
+ ---
133
+
134
+ 180422 追記その2
135
+
136
+ 以下のコードは待機処理(`Call WaitWshExec(wExec)`)が有る場合、「1」が表示されますが、待機処理ををコメントアウトすると「0」が表示されます。
137
+
138
+ ```vbscript
139
+ Option Explicit
140
+
141
+ Dim execCmd 'As String
142
+ execCmd = "cmd /c dir & exit /b 1" '何か処理をして1を返す
143
+
144
+ Dim wExec 'As WshExec
145
+ Set wExec = CreateObject("WScript.Shell").Exec(execCmd)
146
+
147
+ '待機処理
148
+ Call WaitWshExec(wExec)
149
+
150
+ WSH.Echo wExec.ExitCode
151
+
152
+ 'WshExecの待機用
153
+ Sub WaitWshExec(wExec)
154
+ '実行したコマンドが終了するまで待機
155
+ Const WshRunning = 0, WshFinished = 1, WshFailed = 2
156
+ Do While wExec.Status = WshRunning
157
+ WSH.Sleep 10
158
+ Loop
159
+ End Sub
130
160
  ```

2

コメントに対する回答追記

2018/04/22 12:07

投稿

imihito
imihito

スコア2166

answer CHANGED
@@ -14,4 +14,117 @@
14
14
  '...
15
15
  ```
16
16
 
17
- といった形になります
17
+ といった形になります
18
+
19
+ ---
20
+
21
+ 180422追記
22
+ コメントに対する返答
23
+
24
+ まず、コメントされたコードにインデントなどを追加して整形します。
25
+
26
+ ```vbscript
27
+ Dim Shell, wExec
28
+ Set Shell = WScript.CreateObject("WScript.Shell")
29
+ Shell.Exec ("robocopy c:\test c:\test2")
30
+
31
+ Set wExec = WshShell.Exec("%comspec% /c dire")
32
+
33
+ Function ReadAllFromAny(wExec)
34
+ If wExec.ExitCode = 0 Then
35
+ MsgBox "0スキップしました"
36
+ ElseIf wExec.ExitCode = 1 Then
37
+ MsgBox "1成功です"
38
+ ElseIf wExec.ExitCode >= 8 Then
39
+ MsgBox "8失敗です"
40
+ End If
41
+
42
+ ```
43
+
44
+ 整形してみれば一目瞭然ですが、Functionプロシージャの定義が終わっていません。
45
+
46
+ ```vbscript
47
+ Dim Shell, wExec
48
+ Set Shell = WScript.CreateObject("WScript.Shell")
49
+ Shell.Exec ("robocopy c:\test c:\test2")
50
+
51
+ Set wExec = WshShell.Exec("%comspec% /c dire")
52
+
53
+ Function ReadAllFromAny(wExec)
54
+ If wExec.ExitCode = 0 Then
55
+ MsgBox "0スキップしました"
56
+ ElseIf wExec.ExitCode = 1 Then
57
+ MsgBox "1成功です"
58
+ ElseIf wExec.ExitCode >= 8 Then
59
+ MsgBox "8失敗です"
60
+ End If
61
+ End Function '''追加
62
+ ```
63
+
64
+ これで最低限コンパイルは通りますが、多くの問題が残っています。
65
+
66
+ 動作上問題になる部分だけを挙げると
67
+
68
+ 1. 宣言していない変数がある(`WshShell`、Option Explicit があれば自動チェック)
69
+ 1. 参照する`wExec`が違う(結果を受け取りたいコマンドは?)
70
+ 1. `wExec`の待機処理が無い
71
+ 1. `ReadAllFromAny`を呼び出していない
72
+
73
+ などがあります。
74
+
75
+ 問題の箇所が多く、それぞれについて指摘して修正するのは手間なので、
76
+ 今回はざっくり全体を修正したコードを示します。
77
+
78
+ ```vbscript
79
+ 'https://teratail.com/questions/122953
80
+ Option Explicit
81
+
82
+ Call RunRoboCopy
83
+
84
+ Sub RunRoboCopy()
85
+
86
+ 'コピー元ディレクトリ
87
+ Dim srcDir 'As String
88
+ srcDir = "c:\test"
89
+
90
+ 'コピー先ディレクトリ
91
+ Dim destDir 'As String
92
+ destDir = "c:\test2"
93
+
94
+ Dim robocopyCmd 'As String
95
+ robocopyCmd = "robocopy " & srcDir & " " & destDir ''' "robocopy c:\test c:\test2"
96
+
97
+ ''' wsShell <- Shell
98
+ Dim wsShell 'As WshShell
99
+ Set wsShell = CreateObject("WScript.Shell")
100
+
101
+ 'robocopy実行
102
+ Dim wExec 'As WshExec
103
+ Set wExec = wsShell.Exec(robocopyCmd)
104
+
105
+
106
+ '実行したコマンドが終了するまで待機
107
+ Const WshRunning = 0, WshFinished = 1, WshFailed = 2
108
+ Do While wExec.Status = WshRunning
109
+ WSH.Sleep 10
110
+ 'DoEvents 'for VBA
111
+ Loop
112
+
113
+ If wExec.ExitCode = 0 Then
114
+ MsgBox "0 スキップしました"
115
+ ElseIf wExec.ExitCode = 1 Then
116
+ MsgBox "1 成功です"
117
+ ElseIf wExec.ExitCode >= 8 Then
118
+ MsgBox "8 失敗です"
119
+ Else
120
+ MsgBox wExec.ExitCode & " メッセージが設定されていません"
121
+ End If
122
+
123
+ Dim result 'As String
124
+ result = wExec.StdOut.ReadAll
125
+
126
+ WSH.Echo result
127
+ 'Debug.Print result 'for VBA
128
+
129
+ End Sub
130
+ ```

1

MSDNへのリンク追記

2018/04/22 08:37

投稿

imihito
imihito

スコア2166

answer CHANGED
@@ -1,5 +1,8 @@
1
1
  `Shell.Exec(~`の返り値である`WshExec`オブジェクトの`ExitCode`プロパティから、実行したプログラムの終了コードを受け取ることができます。
2
- (ExitCodeプロパティに関する公式の文書はパッと出てこないですが…)
2
+ ~~(ExitCodeプロパティに関する公式の文書はパッと出てこないですが…)~~
3
+ 参考
4
+ > [WshScriptExec オブジェクト](https://msdn.microsoft.com/ja-jp/library/cc364375.aspx)
5
+ > [ExitCode プロパティ](https://msdn.microsoft.com/ja-jp/library/cc364359.aspx)
3
6
 
4
7
  関連質問と思われる[こちら](https://teratail.com/questions/121566)のコード内の変数で示すと
5
8