回答編集履歴

3

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

2018/04/22 12:07

投稿

imihito
imihito

スコア2166

test CHANGED
@@ -257,3 +257,63 @@
257
257
  End Sub
258
258
 
259
259
  ```
260
+
261
+
262
+
263
+ ---
264
+
265
+
266
+
267
+ 180422 追記その2
268
+
269
+
270
+
271
+ 以下のコードは待機処理(`Call WaitWshExec(wExec)`)が有る場合、「1」が表示されますが、待機処理ををコメントアウトすると「0」が表示されます。
272
+
273
+
274
+
275
+ ```vbscript
276
+
277
+ Option Explicit
278
+
279
+
280
+
281
+ Dim execCmd 'As String
282
+
283
+ execCmd = "cmd /c dir & exit /b 1" '何か処理をして1を返す
284
+
285
+
286
+
287
+ Dim wExec 'As WshExec
288
+
289
+ Set wExec = CreateObject("WScript.Shell").Exec(execCmd)
290
+
291
+
292
+
293
+ '待機処理
294
+
295
+ Call WaitWshExec(wExec)
296
+
297
+
298
+
299
+ WSH.Echo wExec.ExitCode
300
+
301
+
302
+
303
+ 'WshExecの待機用
304
+
305
+ Sub WaitWshExec(wExec)
306
+
307
+ '実行したコマンドが終了するまで待機
308
+
309
+ Const WshRunning = 0, WshFinished = 1, WshFailed = 2
310
+
311
+ Do While wExec.Status = WshRunning
312
+
313
+ WSH.Sleep 10
314
+
315
+ Loop
316
+
317
+ End Sub
318
+
319
+ ```

2

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

2018/04/22 12:07

投稿

imihito
imihito

スコア2166

test CHANGED
@@ -31,3 +31,229 @@
31
31
 
32
32
 
33
33
  といった形になります
34
+
35
+
36
+
37
+ ---
38
+
39
+
40
+
41
+ 180422追記
42
+
43
+ コメントに対する返答
44
+
45
+
46
+
47
+ まず、コメントされたコードにインデントなどを追加して整形します。
48
+
49
+
50
+
51
+ ```vbscript
52
+
53
+ Dim Shell, wExec
54
+
55
+ Set Shell = WScript.CreateObject("WScript.Shell")
56
+
57
+ Shell.Exec ("robocopy c:\test c:\test2")
58
+
59
+
60
+
61
+ Set wExec = WshShell.Exec("%comspec% /c dire")
62
+
63
+
64
+
65
+ Function ReadAllFromAny(wExec)
66
+
67
+ If wExec.ExitCode = 0 Then
68
+
69
+ MsgBox "0スキップしました"
70
+
71
+ ElseIf wExec.ExitCode = 1 Then
72
+
73
+ MsgBox "1成功です"
74
+
75
+ ElseIf wExec.ExitCode >= 8 Then
76
+
77
+ MsgBox "8失敗です"
78
+
79
+ End If
80
+
81
+
82
+
83
+ ```
84
+
85
+
86
+
87
+ 整形してみれば一目瞭然ですが、Functionプロシージャの定義が終わっていません。
88
+
89
+
90
+
91
+ ```vbscript
92
+
93
+ Dim Shell, wExec
94
+
95
+ Set Shell = WScript.CreateObject("WScript.Shell")
96
+
97
+ Shell.Exec ("robocopy c:\test c:\test2")
98
+
99
+
100
+
101
+ Set wExec = WshShell.Exec("%comspec% /c dire")
102
+
103
+
104
+
105
+ Function ReadAllFromAny(wExec)
106
+
107
+ If wExec.ExitCode = 0 Then
108
+
109
+ MsgBox "0スキップしました"
110
+
111
+ ElseIf wExec.ExitCode = 1 Then
112
+
113
+ MsgBox "1成功です"
114
+
115
+ ElseIf wExec.ExitCode >= 8 Then
116
+
117
+ MsgBox "8失敗です"
118
+
119
+ End If
120
+
121
+ End Function '''追加
122
+
123
+ ```
124
+
125
+
126
+
127
+ これで最低限コンパイルは通りますが、多くの問題が残っています。
128
+
129
+
130
+
131
+ 動作上問題になる部分だけを挙げると
132
+
133
+
134
+
135
+ 1. 宣言していない変数がある(`WshShell`、Option Explicit があれば自動チェック)
136
+
137
+ 1. 参照する`wExec`が違う(結果を受け取りたいコマンドは?)
138
+
139
+ 1. `wExec`の待機処理が無い
140
+
141
+ 1. `ReadAllFromAny`を呼び出していない
142
+
143
+
144
+
145
+ などがあります。
146
+
147
+
148
+
149
+ 問題の箇所が多く、それぞれについて指摘して修正するのは手間なので、
150
+
151
+ 今回はざっくり全体を修正したコードを示します。
152
+
153
+
154
+
155
+ ```vbscript
156
+
157
+ 'https://teratail.com/questions/122953
158
+
159
+ Option Explicit
160
+
161
+
162
+
163
+ Call RunRoboCopy
164
+
165
+
166
+
167
+ Sub RunRoboCopy()
168
+
169
+
170
+
171
+ 'コピー元ディレクトリ
172
+
173
+ Dim srcDir 'As String
174
+
175
+ srcDir = "c:\test"
176
+
177
+
178
+
179
+ 'コピー先ディレクトリ
180
+
181
+ Dim destDir 'As String
182
+
183
+ destDir = "c:\test2"
184
+
185
+
186
+
187
+ Dim robocopyCmd 'As String
188
+
189
+ robocopyCmd = "robocopy " & srcDir & " " & destDir ''' "robocopy c:\test c:\test2"
190
+
191
+
192
+
193
+ ''' wsShell <- Shell
194
+
195
+ Dim wsShell 'As WshShell
196
+
197
+ Set wsShell = CreateObject("WScript.Shell")
198
+
199
+
200
+
201
+ 'robocopy実行
202
+
203
+ Dim wExec 'As WshExec
204
+
205
+ Set wExec = wsShell.Exec(robocopyCmd)
206
+
207
+
208
+
209
+
210
+
211
+ '実行したコマンドが終了するまで待機
212
+
213
+ Const WshRunning = 0, WshFinished = 1, WshFailed = 2
214
+
215
+ Do While wExec.Status = WshRunning
216
+
217
+ WSH.Sleep 10
218
+
219
+ 'DoEvents 'for VBA
220
+
221
+ Loop
222
+
223
+
224
+
225
+ If wExec.ExitCode = 0 Then
226
+
227
+ MsgBox "0 スキップしました"
228
+
229
+ ElseIf wExec.ExitCode = 1 Then
230
+
231
+ MsgBox "1 成功です"
232
+
233
+ ElseIf wExec.ExitCode >= 8 Then
234
+
235
+ MsgBox "8 失敗です"
236
+
237
+ Else
238
+
239
+ MsgBox wExec.ExitCode & " メッセージが設定されていません"
240
+
241
+ End If
242
+
243
+
244
+
245
+ Dim result 'As String
246
+
247
+ result = wExec.StdOut.ReadAll
248
+
249
+
250
+
251
+ WSH.Echo result
252
+
253
+ 'Debug.Print result 'for VBA
254
+
255
+
256
+
257
+ End Sub
258
+
259
+ ```

1

MSDNへのリンク追記

2018/04/22 08:37

投稿

imihito
imihito

スコア2166

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