cmd/tests: Add tests for SHIFT builtin.
[wine] / programs / cmd / tests / test_builtins.cmd
1 echo Tests for cmd's builtin commands
2
3 @echo on
4 echo ------------ Testing 'echo' [ON] --------------
5 echo word
6 echo 'singlequotedword'
7 echo "doublequotedword"
8 @echo at-echoed-word
9 echo "/?"
10 echo.
11 echo .
12 echo.word
13 echo .word
14 echo:
15 echo :
16 echo:word
17 echo :word
18 echo off now
19 echo word@space@
20 echo word@space@@space@
21  echo word
22 echo@tab@word
23 echo@tab@word @tab@
24 echo@tab@word@tab@@space@
25 @tab@echo word
26 echo @tab@word
27 echo  @tab@word
28 echo@tab@@tab@word
29
30 @echo off
31 echo ------------ Testing 'echo' [OFF] --------------
32 echo word
33 echo 'singlequotedword'
34 echo "doublequotedword"
35 @echo at-echoed-word
36 echo "/?"
37 echo.
38 echo .
39 echo.word
40 echo .word
41 echo:
42 echo :
43 echo:word
44 echo :word
45 echo on again
46 echo word@space@
47 echo word@space@@space@
48  echo word
49 echo@tab@word
50 echo@tab@word @tab@
51 echo@tab@word@tab@@space@
52 @tab@echo word
53 echo @tab@word
54 echo  @tab@word
55 echo@tab@@tab@word
56
57 echo ------------ Testing mixed echo modes --------------
58 echo @echo on> mixedEchoModes.cmd
59 echo if 1==1 echo foo>> mixedEchoModes.cmd
60 echo if 1==1 @echo bar>> mixedEchoModes.cmd
61 echo @echo off>> mixedEchoModes.cmd
62 echo if 1==1 echo foo2>> mixedEchoModes.cmd
63 echo if 1==1 @echo bar2>> mixedEchoModes.cmd
64 type mixedEchoModes.cmd
65 cmd /c mixedEchoModes.cmd
66 del mixedEchoModes.cmd
67
68 echo ------------ Testing rem --------------
69 rem Hello
70 rem  Hello
71 rem   Hello || foo
72 rem echo lol
73 rem echo foo & echo bar
74 rem @tab@  Hello
75 rem@tab@  Hello
76 rem@tab@echo foo & echo bar
77 @echo on
78 rem Hello
79 rem  Hello
80 rem   Hello || foo
81 rem echo lol
82 rem echo foo & echo bar
83 rem @tab@  Hello
84 rem@tab@  Hello
85 rem@tab@echo foo & echo bar
86 @echo off
87
88 echo ------------ Testing redirection operators --------------
89 mkdir foobar & cd foobar
90 echo ...stdout redirection
91 echo foo>foo
92 type foo
93 echo foo 1> foo
94 type foo
95 echo foo@tab@1> foo
96 type foo
97 echo foo 1>@tab@foo
98 type foo
99 echo foo@tab@1>@tab@foo
100 type foo
101 echo foo7 7> foo
102 type foo
103 echo foo9 9> foo
104 type foo
105 echo foo1> foo
106 type foo
107 echo foo11> foo
108 type foo
109 echo foo12> foo
110 type foo
111 del foo
112 echo1>foo
113 type foo
114 echo ...stdout appending
115 echo foo>foo
116 echo foo >>foo
117 type foo
118 del foo
119 echo foob >> foo
120 type foo
121 echo fooc 1>>foo
122 type foo
123 echo food1>>foo
124 type foo
125 echo food2>>foo
126 type foo
127 del foo
128 echo food21>>foo
129 type foo
130 del foo
131 echo foo> foo
132 echo foo7 7>> foo || (echo not supported & del foo)
133 if exist foo (type foo) else echo not supported
134 echo ...redirections within IF statements
135 if 1==1 echo foo1>bar
136 type bar & del bar
137 if 1==1 (echo foo2>bar) else echo baz2>bar
138 type bar & del bar
139 if 1==1 (echo foo3) else echo baz3>bar
140 type bar || echo file does not exist, ok
141 if 1==1 (echo foo4>bar) else echo baz4>bar
142 type bar & del bar
143 if 1==0 (echo foo5>bar) else echo baz5>bar
144 type bar & del bar
145 if 1==0 (echo foo6) else echo baz6 1>bar
146 type bar & del bar
147 if 1==0 (echo foo7 1>bar) else echo baz7>bar
148 type bar & del bar
149 if 1==0 (echo foo8 1>bar) else echo baz8>bak
150 type bak
151 if 1==1 (echo foo>bar & echo baz)
152 type bar
153 if 1==1 (
154    echo foo>bar
155    echo baz
156 )
157 type bar
158 (if 1==1 (echo A) else echo B) > C
159 type C
160 (if 1==0 (echo A) else echo B) > C
161 type C
162 (if 1==0 (echo A > B) else echo C)
163 cd .. & rd /s/q foobar
164
165 echo ------------ Testing ^^ escape character --------------
166 rem Using something like "echo foo^" asks for an additional char after a "More?" prompt on the following line; it's not possible to currently test that non-interactively
167 echo ^hell^o, world
168 echo hell^o, world
169 echo hell^^o, world
170 echo hell^^^o, world
171 mkdir foobar
172 echo baz> foobar\baz
173 type foobar\baz
174 type foobar^\baz
175 rd /s/q foobar
176 echo foo ^| echo bar
177 echo foo ^& echo bar
178 call :setError 0
179 echo bak ^&& echo baz 2> nul
180 echo %ErrorLevel%
181 echo foo ^> foo
182 echo ^<> foo
183 type foo
184 del foo
185 set FOO=oof
186 echo ff^%FOO%
187 set FOO=bar ^| baz
188 set FOO
189 rem FIXME: echoing %FOO% gives an error (baz not recognized) but prematurely
190 rem exits the script on windows; redirecting stdout and/or stderr doesn't help
191 echo %ErrorLevel%
192 call :setError 0
193 set FOO=bar ^^^| baz
194 set FOO
195 echo %FOO%
196 echo %ErrorLevel%
197 set FOO=
198
199 echo ------------ Testing 'set' --------------
200 call :setError 0
201 set FOOBAR 2> nul > nul
202 echo %ErrorLevel%
203 set FOOBAR =  baz
204 echo %ErrorLevel%
205 echo %FOOBAR%FOOBAR not defined
206 echo %FOOBAR %
207 set FOOBAR 2> nul
208 set FOOBAR =  baz2
209 echo %ErrorLevel%
210 echo %fOObAr %
211 set FOOBAR= bar
212 echo %ErrorLevel%
213 echo %FOOBAR%
214 set FOO
215 set FOOBAR=
216 set FOOB
217 echo %FOOBAR%FOOBAR not defined
218 set FOOBAR =
219 set FOOBA 2> nul > nul
220 echo %ErrorLevel%
221 set FOO=bar
222 echo %FOO%
223 set FOO=foo
224 set BAR=bar
225 echo %FOO%%BAR%
226 set BAR=
227 set FOO=
228 set FOO=%FOO%
229 echo %FOO%FOO not defined
230 set BAZ%=bazbaz
231 set BA
232 echo %BAZ%%
233 set BAZ%=
234 echo set "FOO=bar" should not include the quotes in the variable value
235 set "FOO=bar"
236 echo %FOO%
237 set@tab@FOO=foo
238 echo %FOO%
239 set@tab@FOO=
240 echo '%FOO%'
241 set FOO=foo@space@
242 echo '%FOO%'
243 set FOO=foo@tab@
244 echo '%FOO%'
245 set FOO=
246
247 echo ------------ Testing variable expansion --------------
248 call :setError 0
249 echo ~dp0 should be directory containing batch file
250 echo %~dp0
251 mkdir dummydir
252 cd dummydir
253 echo %~dp0
254 cd ..
255 rmdir dummydir
256 echo CD value %CD%
257 echo %%
258 echo P%
259 echo %P
260 echo %UNKNOWN%S
261 echo P%UNKNOWN%
262 echo P%UNKNOWN%S
263 echo %ERRORLEVEL
264 echo %ERRORLEVEL%
265 echo %ERRORLEVEL%%ERRORLEVEL%
266 echo %ERRORLEVEL%ERRORLEVEL%
267 echo %ERRORLEVEL%%
268 echo %ERRORLEVEL%%%
269 echo P%ERRORLEVEL%
270 echo %ERRORLEVEL%S
271 echo P%ERRORLEVEL%S
272
273 echo ------------ Testing variable substrings --------------
274 set VAR=qwerty
275 echo %VAR:~0,1%
276 echo %VAR:~0,3%
277 echo %VAR:~2,2%
278 echo '%VAR:~-2,3%'
279 echo '%VAR:~-2,1%'
280 echo %VAR:~2,-1%
281 echo %VAR:~2,-3%
282 echo '%VAR:~-2,-4%'
283 echo %VAR:~-3,-2%
284 set VAR=
285
286 echo ------------ Testing variable substitution --------------
287 echo ...in FOR variables
288 for %%i in ("A B" C) do echo %%i
289 rem quotes removal
290 for %%i in ("A B" C) do echo '%%~i'
291 rem fully qualified path
292 for %%f in ("C D" E) do echo %%~ff
293 rem drive letter
294 for %%i in ("F G" H) do echo %%~di
295 rem path
296 for %%d in ("I J" K) do echo %%~pd
297 rem filename
298 for %%i in ("L M" N) do echo %%~ni
299 rem file extension
300 for %%i in ("O. P.OOL" Q.TABC hello) do echo '%%~xi'
301 rem path with short path names
302 for %%I in ("R S" T ABCDEFGHIJK.LMNOP) do echo '%%~sI'
303 rem file attribute
304 for %%i in ("U V" W) do echo '%%~ai'
305 echo foo> foo
306 for %%i in (foo) do echo '%%~ai'
307 del foo
308 rem file date/time
309 rem Not fully testable, until we can grep dir's output to get foo's creation time in an envvar...
310 for %%i in ("a b" c) do echo '%%~ti'
311 rem file size
312 rem Similar issues as above
313 for %%i in ("a b" c) do echo '%%~zi'
314 rem combined options
315 for %%i in ("d e" f) do echo %%~dpi
316 for %%i in ("g h" i) do echo %%~sdi
317 for %%i in ("g h" i) do echo %%~dsi
318 for %%i in ("j k" l.eh) do echo '%%~xsi'
319
320 echo ...in parameters
321 for %%i in ("A B" C) do call :echoFun %%i
322 rem quotes removal
323 for %%i in ("A B" C) do call :echoFunQ %%i
324 rem fully qualified path
325 for %%f in ("C D" E) do call :echoFunF %%f
326 rem drive letter
327 for %%i in ("F G" H) do call :echoFunD %%i
328 rem path
329 for %%d in ("I J" K) do call :echoFunP %%d
330 rem filename
331 for %%i in ("L M" N) do call :echoFunN %%i
332 rem file extension
333 for %%i in ("O. P.OOL" Q.TABC hello) do call :echoFunX %%i
334 rem path with short path names
335 for %%I in ("R S" T ABCDEFGHIJK.LMNOP) do call :echoFunS %%I
336 rem NT4 aborts whole script execution when encountering ~a, ~t and ~z substitutions, preventing full testing
337 rem combined options
338 for %%i in ("d e" f) do call :echoFunDP %%i
339 for %%i in ("g h" i) do call :echoFunSD %%i
340 for %%i in ("g h" i) do call :echoFunDS %%i
341 for %%i in ("j k" l.eh) do call :echoFunXS %%i
342
343 goto :endEchoFuns
344 :echoFun
345 echo %1
346 goto :eof
347
348 :echoFunQ
349 echo '%~1'
350 goto :eof
351
352 :echoFunF
353 echo %~f1
354 goto :eof
355
356 :echoFunD
357 echo %~d1
358 goto :eof
359
360 :echoFunP
361 echo %~p1
362 goto :eof
363
364 :echoFunN
365 echo %~n1
366 goto :eof
367
368 :echoFunX
369 echo '%~x1'
370 goto :eof
371
372 :echoFunS
373 rem some NT4 workaround
374 set VAR='%~s1'
375 echo %VAR%
376 set VAR=
377 goto :eof
378
379 :echoFunDP
380 echo %~dp1
381 goto :eof
382
383 :echoFunSD
384 echo %~sd1
385 goto :eof
386
387 :echoFunDS
388 echo %~ds1
389 goto :eof
390
391 :echoFunXS
392 echo '%~xs1'
393 goto :eof
394 :endEchoFuns
395
396 echo ------------ Testing variable delayed expansion --------------
397 rem NT4 doesn't support this
398 echo ...default mode (load-time expansion)
399 set FOO=foo
400 echo %FOO%
401 echo !FOO!
402 if %FOO% == foo (
403     set FOO=bar
404     if %FOO% == bar (echo bar) else echo foo
405 )
406
407 set FOO=foo
408 if %FOO% == foo (
409     set FOO=bar
410     if !FOO! == bar (echo bar) else echo foo
411 )
412
413 echo ...runtime (delayed) expansion mode
414 setlocal EnableDelayedExpansion
415 set FOO=foo
416 echo %FOO%
417 echo !FOO!
418 if %FOO% == foo (
419     set FOO=bar
420     if %FOO% == bar (echo bar) else echo foo
421 )
422
423 set FOO=foo
424 if %FOO% == foo (
425     set FOO=bar
426     if !FOO! == bar (echo bar) else echo foo
427 )
428 echo %ErrorLevel%
429 setlocal DisableDelayedExpansion
430 echo %ErrorLevel%
431 set FOO=foo
432 echo %FOO%
433 echo !FOO!
434 set FOO=
435 echo ...using /V cmd flag
436 echo @echo off> tmp.cmd
437 echo set FOO=foo>> tmp.cmd
438 echo echo %%FOO%%>> tmp.cmd
439 echo echo !FOO!>> tmp.cmd
440 echo set FOO=>> tmp.cmd
441 cmd /V:ON /C tmp.cmd
442 cmd /V:OfF /C tmp.cmd
443 del tmp.cmd
444
445 echo ------------ Testing conditional execution --------------
446 echo ...unconditional ^&
447 call :setError 123 & echo foo1
448 echo bar2 & echo foo2
449 mkdir foobar & cd foobar
450 echo > foobazbar
451 cd .. & rd /s/q foobar
452 if exist foobazbar (
453     echo foobar not deleted!
454     cd ..
455     rd /s/q foobar
456 ) else echo foobar deleted
457 echo ...on success conditional ^&^&
458 call :setError 456 && echo foo3 > foo3
459 if exist foo3 (
460     echo foo3 created
461     del foo3
462 ) else echo foo3 not created
463 echo bar4 && echo foo4
464 echo ...on failure conditional ^|^|
465 call :setError 789 || echo foo5
466 echo foo6 || echo bar6 > bar6
467 if exist bar6 (
468     echo bar6 created
469     del bar6
470 )
471
472 echo ------------ Testing cd ------------
473 mkdir foobar
474 cd foobar
475 echo blabla > singleFile
476 dir /b
477 echo Current dir: %CD%
478 cd
479 cd ..
480 cd
481 cd foobar@space@
482 cd
483 cd ..
484 cd
485 cd @space@foobar
486 cd
487 cd..
488 cd
489 cd foobar
490 cd..@space@
491 cd
492 if not exist foobar (cd ..)
493 cd foobar
494 cd@tab@..@tab@@space@@tab@
495 cd
496 if not exist foobar (cd ..)
497 cd foobar
498 mkdir "bar bak"
499 cd "bar bak"
500 cd
501 cd ..
502 cd bar bak
503 cd
504 cd "bar bak@space@"@tab@@space@
505 cd
506 cd ..\..
507 cd
508 rd /Q/s foobar
509 mkdir foobar
510 cd /d@tab@foobar
511 cd
512 cd ..
513 rd /q/s foobar
514
515 echo ------------ Testing type ------------
516 echo bar> foobaz
517 @echo on
518 type foobaz
519 echo ***
520 @echo off
521 type foobaz@tab@
522 echo ***
523 del foobaz
524
525 echo ------------ Testing NUL ------------
526 md foobar & cd foobar
527 rem NUL file (non) creation + case insensitivity
528 rem Note: "if exist" does not work with NUL, so to check for file existence we use a kludgy workaround
529 echo > bar
530 echo foo > NUL
531 dir /b /a-d
532 echo foo > nul
533 dir /b /a-d
534 echo foo > NuL
535 @tab@dir /b@tab@/a-d
536 del bar
537 rem NUL not special everywhere
538 call :setError 123
539 echo NUL> foo
540 if not exist foo (echo foo should have been created) else (
541     type foo
542     del foo
543 )
544 rem Empty file creation
545 copy nul foo > nul
546 if exist foo (
547     echo foo created
548     del foo
549     type foo
550 ) else (
551     echo ***
552 )
553 cd .. & rd foobar
554
555 echo ------------ Testing if/else --------------
556 echo if/else should work with blocks
557 if 0 == 0 (
558   echo if seems to work
559 ) else (
560   echo if seems to be broken
561 )
562 if 1 == 0 (
563   echo else seems to be broken
564 ) else (
565   echo else seems to work
566 )
567 if /c==/c (
568   echo if seems not to detect /c as parameter
569 ) else (
570   echo parameter detection seems to be broken
571 )
572 echo Testing case sensitivity with and without /i option
573 if bar==BAR echo if does not default to case sensitivity
574 if not bar==BAR echo if seems to default to case sensitivity
575 if /i foo==FOO echo if /i seems to work
576 if /i not foo==FOO echo if /i seems to be broken
577 if /I foo==FOO echo if /I seems to work
578 if /I not foo==FOO echo if /I seems to be broken
579 echo Testing string comparisons
580 if abc == abc  (echo equal) else echo non equal
581 if abc =="abc" (echo equal) else echo non equal
582 if "abc"== abc (echo equal) else echo non equal
583 if "abc"== "abc" (echo equal) else echo non equal
584 echo Testing tabs handling
585 if@tab@1==1 echo doom
586 if @tab@1==1 echo doom
587 if 1==1 (echo doom) else@tab@echo quake
588 if@tab@not @tab@1==@tab@0 @tab@echo lol
589 if 1==0@tab@(echo doom) else echo quake
590 if 1==0 (echo doom)@tab@else echo quake
591 if 1==0 (echo doom) else@tab@echo quake
592
593 echo -----------Testing for -----------
594 echo ...plain FOR
595 for %%i in (A B C) do echo %%i
596 for %%i in (A B C) do echo %%I
597 for %%i in (A B C) do echo %%j
598 for %%i in (A B C) do call :forTestFun1 %%i
599 for %%i in (1,4,1) do echo %%i
600 for %%i in (A, B,C) do echo %%i
601 for %%i in  (X) do echo %%i
602 for@tab@%%i in  (X2) do echo %%i
603 for %%i in@tab@(X3) do echo %%i
604 for %%i in (@tab@ foo@tab@) do echo %%i
605 for@tab@ %%i in@tab@(@tab@M) do echo %%i
606 for %%i@tab@in (X)@tab@do@tab@echo %%i
607 for@tab@ %%j in@tab@(@tab@M, N, O@tab@) do echo %%j
608 for %%i in (`echo A B`) do echo %%i
609 for %%i in ('echo A B') do echo %%i
610 for %%i in ("echo A B") do echo %%i
611 for %%i in ("A B" C) do echo %%i
612 goto :endForTestFun1
613 :forTestFun1
614 echo %1
615 goto :eof
616 :endForTestFun1
617 echo ...imbricated FORs
618 for %%i in (X) do (
619     for %%j in (Y) do (
620         echo %%i %%j))
621 for %%i in (X) do (
622     for %%I in (Y) do (
623         echo %%i %%I))
624 for %%i in (A B) do (
625     for %%j in (C D) do (
626         echo %%i %%j))
627 for %%i in (A B) do (
628     for %%j in (C D) do (
629         call :forTestFun2 %%i %%j ))
630 goto :endForTestFun2
631 :forTestFun2
632 echo %1 %2
633 goto :eof
634 :endForTestFun2
635 mkdir foobar & cd foobar
636 mkdir foo
637 mkdir bar
638 mkdir baz
639 echo > bazbaz
640 echo ...basic wildcards
641 for %%i in (ba*) do echo %%i
642 echo ...for /d
643 for /d %%i in (baz foo bar) do echo %%i
644 rem FIXME for /d incorrectly parses when wildcards are used
645 rem for /d %%i in (bazb*) do echo %%i
646 rem FIXME can't test wildcard expansion here since it's listed in directory
647 rem order, and not in alphabetic order.
648 rem Proper testing would need a currently missing "sort" program implementation.
649 rem for /d %%i in (ba*) do echo %%i>> tmp
650 rem sort < tmp
651 rem del tmp
652 rem for /d %%i in (?a*) do echo %%i>> tmp
653 rem sort < tmp
654 rem del tmp
655 rem for /d %%i in (*) do echo %%i>> tmp
656 rem sort < tmp
657 rem del tmp
658 cd .. & rd /s/Q foobar
659 echo ...for /L
660 rem Some cases loop forever writing 0s, like e.g. (1,0,1), (1,a,3) or (a,b,c); those can't be tested here
661 for /L %%i in (1,2,0) do echo %%i
662 for@tab@/L %%i in (1,2,0) do echo %%i
663 for /L %%i in (1,2,6) do echo %%i
664 for /l %%i in (1 ,2,6) do echo %%i
665 for /L %%i in (a,2,3) do echo %%i
666 for /L %%i in (1,2,-1) do echo %%i
667 for /L %%i in (-4,-1,-1) do echo %%i
668 for /L %%i in (1,-2,-2) do echo %%i
669 for /L %%i in (1,2,a) do echo %%i
670 echo ErrorLevel %ErrorLevel%
671 for /L %%i in (1,a,b) do echo %%i
672 echo ErrorLevel %ErrorLevel%
673 rem FIXME: following test cases cannot be currently tested due to an inconsistent/buggy 'for /L' parsing.
674 rem for /L %%i in (a,2,b) do echo %%i
675 rem for /L %%i in (1,1,1) do echo %%i
676 rem for /L %%i in (1,-2,-1) do echo %%i
677 rem for /L %%i in (-1,-1,-1) do echo %%i
678 rem for /L %%i in (1,2, 3) do echo %%i
679 echo ...for /a
680 rem No output when using "set expr" syntax, unless in interactive mode
681 rem Need to use "set envvar=expr" to use in a batch script
682 echo ......individual operations
683 set var=0
684 set /a var=1 +2 & echo %var%
685 set /a var=1 +-2 & echo %var%
686 set /a var=1 --2 & echo %var%
687 set /a var=2* 3 & echo %var%
688 set /a var=-2* -5 & echo %var%
689 set /a var=12/3 & echo %var%
690 set /a var=13/3 & echo %var%
691 set /a var=-13/3 & echo %var%
692 rem FIXME Divide by zero should return an error, but error messages cannot be tested with current infrastructure
693 set /a var=5 %% 5 & echo %var%
694 set /a var=5 %% 3 & echo %var%
695 set /a var=5 %% -3 & echo %var%
696 set /a var=-5 %% -3 & echo %var%
697 set /a var=1 ^<^< 0 & echo %var%
698 set /a var=1 ^<^< 2 & echo %var%
699 set /a var=1 ^<^< -2 & echo %var%
700 set /a var=-1 ^<^< -2 & echo %var%
701 set /a var=-1 ^<^< 2 & echo %var%
702 set /a var=9 ^>^> 0 & echo %var%
703 set /a var=9 ^>^> 2 & echo %var%
704 set /a var=9 ^>^> -2 & echo %var%
705 set /a var=-9 ^>^> -2 & echo %var%
706 set /a var=-9 ^>^> 2 & echo %var%
707 set /a var=5 ^& 0 & echo %var%
708 set /a var=5 ^& 1 & echo %var%
709 set /a var=5 ^& 3 & echo %var%
710 set /a var=5 ^& 4 & echo %var%
711 set /a var=5 ^& 1 & echo %var%
712 set /a var=5 ^| 0 & echo %var%
713 set /a var=5 ^| 1 & echo %var%
714 set /a var=5 ^| 3 & echo %var%
715 set /a var=5 ^| 4 & echo %var%
716 set /a var=5 ^| 1 & echo %var%
717 set /a var=5 ^^ 0 & echo %var%
718 set /a var=5 ^^ 1 & echo %var%
719 set /a var=5 ^^ 3 & echo %var%
720 set /a var=5 ^^ 4 & echo %var%
721 set /a var=5 ^^ 1 & echo %var%
722 echo ......precedence and grouping
723 set /a var=4 + 2*3 & echo %var%
724 set /a var=(4+2)*3 & echo %var%
725 set /a var=4 * 3/5 & echo %var%
726 set /a var=(4 * 3)/5 & echo %var%
727 set /a var=4 * 5 %% 4 & echo %var%
728 set /a var=4 * (5 %% 4) & echo %var%
729 set /a var=3 %% (5 + 8 %% 3 ^^ 2) & echo %var%
730 set /a var=3 %% (5 + 8 %% 3 ^^ -2) & echo %var%
731 echo ......octal and hexadecimal
732 set /a var=0xf + 3 & echo %var%
733 set /a var=0xF + 3 & echo %var%
734 set /a var=015 + 2 & echo %var%
735 set /a var=3, 8+3,0 & echo %var%
736 echo ......variables
737 set /a var=foo=3, foo+1 & echo %var%
738 if defined foo (echo %foo%) else (
739     echo foo not defined
740 )
741 set /a var=foo=3, foo+=1 & echo %var%
742 set /a var=foo=3, bar=1, bar+=foo, bar & echo %var%
743 set /a var=foo*= foo & echo %var%
744 set /a var=whateverNonExistingVar & echo %var%
745 set /a var=whateverNonExistingVar + bar & echo %var%
746 set /a var=foo -= foo + 7 & echo %var%
747 set /a var=foo /= 3 + 2 & echo %var%
748 set /a var=foo=5, foo %%=2 & echo %var%
749 set /a var=foo ^<^<= 2 & echo %var%
750 set /a var=foo ^>^>= 2 & echo %var%
751 set /a var=foo ^&= 2 & echo %var%
752 set /a var=foo=5, foo ^|= 2 & echo %var%
753 set /a var=foo=5, foo ^^= 2 & echo %var%
754 set /a var=foo=19, foo %%= 4 + (bar %%= 7) & echo.
755 set foo=
756 set bar=
757 set var=
758 echo ...for /F
759 mkdir foobar & cd foobar
760 echo ......string argument
761 for /F %%i in ("a b c") do echo %%i
762 for /f %%i in ("a ") do echo %%i
763 for /f %%i in ("a") do echo %%i
764 fOr /f %%i in (" a") do echo %%i
765 for /f %%i in (" a ") do echo %%i
766 echo ......fileset argument
767 echo .........basic blank handling
768 echo a b c>foo
769 for /f %%i in (foo) do echo %%i
770 echo a >foo
771 for /f %%i in (foo) do echo %%i
772 echo a>foo
773 for /f %%i in (foo) do echo %%i
774 echo  a>foo
775 for /f %%i in (foo) do echo %%i
776 echo  a >foo
777 for /f %%i in (foo) do echo %%i
778 echo. > foo
779 for /f %%i in (foo) do echo %%i
780 echo. >> foo
781 echo b > foo
782 for /f %%i in (foo) do echo %%i
783 echo .........multi-line with empty lines
784 echo a Z f> foo
785 echo. >> foo
786 echo.>> foo
787 echo b bC>> foo
788 echo c>> foo
789 echo. >> foo
790 for /f %%b in (foo) do echo %%b
791 echo .........multiple files
792 echo q w > bar
793 echo.>> bar
794 echo kkk>>bar
795 for /f %%k in (foo bar) do echo %%k
796 for /f %%k in (bar foo) do echo %%k
797 rem echo ......command argument
798 rem Not implemented on NT4
799 rem FIXME: Not testable right now in wine: not implemented and would need
800 rem preliminary grep-like program implementation (e.g. like findstr or fc) even
801 rem for a simple todo_wine test
802 rem (for /f "usebackq" %%i in (`echo z a b`) do echo %%i) || echo not supported
803 rem (for /f usebackq %%i in (`echo z a b`) do echo %%i) || echo not supported
804 echo ......eol option
805 for /f "eol=@" %%i in ("    ad") do echo %%i
806 for /f "eol=@" %%i in (" z@y") do echo %%i
807 for /f "eol=|" %%i in ("a|d") do echo %%i
808 for /f "eol=@" %%i in ("@y") do echo %%i > output_file
809 if not exist output_file (echo no output) else (del output_file)
810 for /f "eol==" %%i in ("=y") do echo %%i > output_file
811 if not exist output_file (echo no output) else (del output_file)
812 echo ......delims option
813 for /f "delims=|" %%i in ("a|d") do echo %%i
814 for /f "delims=|" %%i in ("a |d") do echo %%i
815 for /f "delims=|" %%i in ("a d|") do echo %%i
816 for /f "delims=| " %%i in ("a d|") do echo %%i
817 for /f "delims==" %%i in ("C r=d|") do echo %%i
818 for /f "delims=" %%i in ("foo bar baz") do echo %%i
819 for /f "delims=" %%i in ("c:\foo bar baz\..") do echo %%~fi
820 echo ......skip option
821 echo a > foo
822 echo b >> foo
823 echo c >> foo
824 for /f "skip=2" %%i in (foo) do echo %%i
825 for /f "skip=3" %%i in (foo) do echo %%i > output_file
826 if not exist output_file (echo no output) else (del output_file)
827 for /f "skip=4" %%i in (foo) do echo %%i > output_file
828 if not exist output_file (echo no output) else (del output_file)
829 cd ..
830 rd /s/q foobar
831
832 echo -----------Testing del /a-----------
833 del /f/q *.test > nul
834 echo r > r.test
835 attrib +r r.test
836 echo not-r > not-r.test
837
838 if not exist not-r.test echo not-r.test not found before delete, bad
839 del /a:-r *.test
840 if not exist not-r.test echo not-r.test not found after delete, good
841
842 if not exist r.test echo r.test not found before delete, bad
843 if exist r.test echo r.test found before delete, good
844 del /a:r *.test
845 if not exist r.test echo r.test not found after delete, good
846 if exist r.test echo r.test found after delete, bad
847
848 echo ------------ Testing del /q --------------
849 mkdir del_q_dir
850 cd del_q_dir
851 echo abc > file1
852 echo abc > file2.dat
853 rem If /q doesn't work, cmd will prompt and the test case should hang
854 del /q * > nul
855 for %%a in (1 2.dat) do if exist file%%a echo del /q * failed on file%%a
856 for %%a in (1 2.dat) do if not exist file%%a echo del /q * succeeded on file%%a
857 cd ..
858 rmdir del_q_dir
859
860 echo ------------ Testing del /s --------------
861 mkdir "foo bar"
862 cd "foo bar"
863 mkdir "foo:"
864 echo hi > file1.dat
865 echo there > file2.dat
866 echo bub > file3.dat
867 echo bye > "file with spaces.dat"
868 cd ..
869 del /s file1.dat > nul
870 del file2.dat /s > nul
871 del "file3.dat" /s > nul
872 del "file with spaces.dat" /s > nul
873 cd "foo bar"
874 for %%f in (1 2 3) do if exist file%%f.dat echo Del /s failed on file%%f
875 for %%f in (1 2 3) do if exist file%%f.dat del file%%f.dat
876 if exist "file with spaces.dat" echo Del /s failed on "file with spaces.dat"
877 if exist "file with spaces.dat" del "file with spaces.dat"
878 rmdir "foo:"
879 cd ..
880 rmdir "foo bar"
881
882 echo ----------- Testing mkdir -----------
883 call :setError 0
884 echo ... md and mkdir are synonymous ...
885 mkdir foobar
886 echo %ErrorLevel%
887 rmdir foobar
888 md foobar
889 echo %ErrorLevel%
890 rmdir foobar
891 echo ... creating an already existing directory/file must fail ...
892 mkdir foobar
893 md foobar
894 echo %ErrorLevel%
895 rmdir foobar
896 echo > foobar
897 mkdir foobar
898 echo %ErrorLevel%
899 del foobar
900 echo ... multilevel path creation ...
901 mkdir foo
902 echo %ErrorLevel%
903 mkdir foo\bar\baz
904 echo %ErrorLevel%
905 cd foo
906 echo %ErrorLevel%
907 cd bar
908 echo %ErrorLevel%
909 cd baz
910 echo %ErrorLevel%
911 echo > ..\..\bar2
912 mkdir ..\..\..\foo\bar2
913 echo %ErrorLevel%
914 del ..\..\bar2
915 mkdir ..\..\..\foo\bar2
916 echo %ErrorLevel%
917 rmdir ..\..\..\foo\bar2
918 cd ..
919 rmdir baz
920 cd ..
921 rmdir bar
922 cd ..
923 rmdir foo
924 echo %ErrorLevel%
925 echo ... trailing backslashes ...
926 mkdir foo\\\\
927 echo %ErrorLevel%
928 if exist foo (rmdir foo & echo dir created
929 ) else ( echo dir not created )
930 echo %ErrorLevel%
931 echo ... invalid chars ...
932 mkdir ?
933 echo mkdir ? gives errorlevel %ErrorLevel%
934 call :setError 0
935 mkdir ?\foo
936 echo mkdir ?\foo gives errorlevel %ErrorLevel%
937 call :setError 0
938 mkdir foo\?
939 echo mkdir foo\? gives errorlevel %ErrorLevel%
940 if exist foo (rmdir foo & echo ok, foo created
941 ) else ( echo foo not created )
942 call :setError 0
943 mkdir foo\bar\?
944 echo mkdir foo\bar\? gives errorlevel %ErrorLevel%
945 call :setError 0
946 if not exist foo (
947     echo bad, foo not created
948 ) else (
949     cd foo
950     if exist bar (
951         echo ok, foo\bar created
952         rmdir bar
953     )
954     cd ..
955     rmdir foo
956 )
957 echo ... multiple directories at once ...
958 mkdir foobaz & cd foobaz
959 mkdir foo bar\baz foobar
960 if exist foo (echo foo created) else echo foo not created!
961 if exist bar (echo bar created) else echo bar not created!
962 if exist foobar (echo foobar created) else echo foobar not created!
963 if exist bar\baz (echo bar\baz created) else echo bar\baz not created!
964 cd .. & rd /s/q foobaz
965 call :setError 0
966 mkdir foo\*
967 echo mkdir foo\* errorlevel %ErrorLevel%
968 if exist foo (rmdir foo & echo ok, foo created
969 ) else ( echo bad, foo not created )
970
971 echo ----------- Testing rmdir -----------
972 call :setError 0
973 rem rd and rmdir are synonymous
974 mkdir foobar
975 rmdir foobar
976 echo %ErrorLevel%
977 if not exist foobar echo dir removed
978 mkdir foobar
979 rd foobar
980 echo %ErrorLevel%
981 if not exist foobar echo dir removed
982 rem Removing nonexistent directory
983 rmdir foobar
984 echo %ErrorLevel%
985 rem Removing single-level directories
986 echo > foo
987 rmdir foo
988 echo %ErrorLevel%
989 if exist foo echo file not removed
990 del foo
991 mkdir foo
992 echo > foo\bar
993 rmdir foo
994 echo %ErrorLevel%
995 if exist foo echo non-empty dir not removed
996 del foo\bar
997 mkdir foo\bar
998 rmdir foo
999 echo %ErrorLevel%
1000 if exist foo echo non-empty dir not removed
1001 rmdir foo\bar
1002 rmdir foo
1003 rem Recursive rmdir
1004 mkdir foo\bar\baz
1005 rmdir /s /Q foo
1006 if not exist foo (
1007     echo recursive rmdir succeeded
1008 ) else (
1009     rd foo\bar\baz
1010     rd foo\bar
1011     rd foo
1012 )
1013 mkdir foo\bar\baz
1014 echo foo > foo\bar\brol
1015 rmdir /s /Q foo
1016 if not exist foo (
1017     echo recursive rmdir succeeded
1018 ) else (
1019     rd foo\bar\baz
1020     del foo\bar\brol
1021     rd foo\bar
1022     rd foo
1023 )
1024 rem multiples directories at once
1025 mkdir foobaz & cd foobaz
1026 mkdir foo
1027 mkdir bar\baz
1028 mkdir foobar
1029 rd /s/q foo bar foobar
1030 if not exist foo (echo foo removed) else echo foo not removed!
1031 if not exist bar (echo bar removed) else echo bar not removed!
1032 if not exist foobar (echo foobar removed) else echo foobar not removed!
1033 if not exist bar\baz (echo bar\baz removed) else echo bar\baz not removed!
1034 cd .. & rd /s/q foobaz
1035
1036 echo ----------- Testing pushd/popd -----------
1037 cd
1038 echo ...popd is no-op when dir stack is empty
1039 popd
1040 cd
1041 echo ...pushing non-existing dir
1042 pushd foobar
1043 cd
1044 echo ...basic behaviour
1045 mkdir foobar\baz
1046 pushd foobar
1047 cd
1048 popd
1049 cd
1050 pushd foobar
1051 pushd baz
1052 cd
1053 popd
1054 cd
1055 pushd baz
1056 popd
1057 cd
1058 popd
1059 cd
1060 pushd .
1061 cd foobar\baz
1062 pushd ..
1063 cd
1064 popd
1065 popd
1066 cd
1067 rd /s/q foobar
1068
1069 echo ------------ Testing attrib --------------
1070 rem FIXME Add tests for archive, hidden and system attributes + mixed attributes modifications
1071 mkdir foobar & cd foobar
1072 echo foo original contents> foo
1073 attrib foo
1074 echo > bar
1075 echo ... read-only attribute
1076 rem Read-only files cannot be altered or deleted, unless forced
1077 attrib +R foo
1078 attrib foo
1079 dir /Ar /B
1080 echo bar>> foo
1081 type foo
1082 del foo > NUL 2>&1
1083 if exist foo (
1084     echo Read-only file not deleted
1085 ) else (
1086     echo Should not delete read-only file!
1087 )
1088 del /F foo
1089 if not exist foo (
1090     echo Read-only file forcibly deleted
1091 ) else (
1092     echo Should delete read-only file with del /F!
1093     attrib -r foo
1094     del foo
1095 )
1096 cd .. & rd /s/q foobar
1097 echo ... recursive behaviour
1098 mkdir foobar\baz & cd foobar
1099 echo > level1
1100 echo > whatever
1101 echo > baz\level2
1102 attrib baz\level2
1103 cd ..
1104 attrib +R l*vel? /S > nul 2>&1
1105 cd foobar
1106 attrib level1
1107 attrib baz\level2
1108 echo > bar
1109 attrib bar
1110 cd .. & rd /s/q foobar
1111 echo ... folders processing
1112 mkdir foobar
1113 attrib foobar
1114 cd foobar
1115 mkdir baz
1116 echo toto> baz\toto
1117 attrib +r baz /s /d > nul 2>&1
1118 attrib baz
1119 attrib baz\toto
1120 echo lulu>>baz\toto
1121 type baz\toto
1122 echo > baz\lala
1123 rem Oddly windows allows file creation in a read-only directory...
1124 if exist baz\lala (echo file created in read-only dir) else echo file not created
1125 cd .. & rd /s/q foobar
1126
1127 echo ------------ Testing assoc --------------
1128 rem FIXME Can't test error messages in the current test system, so we have to use some kludges
1129 rem FIXME Revise once || conditional execution is fixed
1130 mkdir foobar & cd foobar
1131 echo ...setting association
1132 assoc .foo > baz
1133 type baz
1134 echo ***
1135
1136 assoc .foo=bar
1137 assoc .foo
1138
1139 rem association set system-wide
1140 echo @echo off> tmp.cmd
1141 echo echo +++>> tmp.cmd
1142 echo assoc .foo>> tmp.cmd
1143 cmd /c tmp.cmd
1144
1145 echo ...resetting association
1146 assoc .foo=
1147 assoc .foo > baz
1148 type baz
1149 echo ***
1150
1151 rem association removal set system-wide
1152 cmd /c tmp.cmd > baz
1153 type baz
1154 echo ***
1155 cd .. & rd /s/q foobar
1156
1157 echo ------------ Testing ftype --------------
1158 rem FIXME Can't test error messages in the current test system, so we have to use some kludges
1159 rem FIXME Revise once || conditional execution is fixed
1160 mkdir foobar & cd foobar
1161 echo ...setting association
1162 ftype footype> baz
1163 type baz
1164 echo ***
1165
1166 ftype footype=foo_opencmd
1167 assoc .foo=footype
1168 ftype footype
1169
1170 rem association set system-wide
1171 echo @echo off> tmp.cmd
1172 echo echo +++>> tmp.cmd
1173 echo ftype footype>> tmp.cmd
1174 cmd /c tmp.cmd
1175
1176 echo ...resetting association
1177 assoc .foo=
1178
1179 rem Removing a file type association doesn't work on XP due to a bug, so a workaround is needed
1180 setlocal EnableDelayedExpansion
1181 set FOO=original value
1182 ftype footype=
1183 ftype footype > baz
1184 for /F %%i in ('type baz') do (set FOO=buggyXP)
1185 rem Resetting actually works on wine/NT4, but is reported as failing due to the peculiar test (and non-support for EnabledDelayedExpansion)
1186 rem FIXME Revisit once a grep-like program like ftype is implemented
1187 rem (e.g. to check baz's size using dir /b instead)
1188 echo !FOO!
1189
1190 rem cleanup registry
1191 echo REGEDIT4> regCleanup.reg
1192 echo.>> regCleanup.reg
1193 echo [-HKEY_CLASSES_ROOT\footype]>> regCleanup.reg
1194 regedit /s regCleanup.reg
1195 set FOO=
1196 endlocal
1197 cd .. & rd /s/q foobar
1198
1199 echo ------------ Testing CALL ------------
1200 mkdir foobar & cd foobar
1201 echo ... external script ...
1202 echo echo foo %%1> foo.cmd
1203 call foo
1204 call foo.cmd 8
1205 echo echo %%1 %%2 > foo.cmd
1206 call foo.cmd foo
1207 call foo.cmd foo bar
1208 call foo.cmd foo ""
1209 call foo.cmd "" bar
1210 call foo.cmd foo ''
1211 call foo.cmd '' bar
1212 del foo.cmd
1213
1214 echo ... internal routines ...
1215 call :testRoutine :testRoutine
1216 goto :endTestRoutine
1217 :testRoutine
1218 echo bar %1
1219 goto :eof
1220 :endTestRoutine
1221
1222 call :testRoutineArgs foo
1223 call :testRoutineArgs foo bar
1224 call :testRoutineArgs foo ""
1225 call :testRoutineArgs ""  bar
1226 call :testRoutineArgs foo ''
1227 call :testRoutineArgs ''  bar
1228 goto :endTestRoutineArgs
1229 :testRoutineArgs
1230 echo %1 %2
1231 goto :eof
1232 :endTestRoutineArgs
1233
1234 echo ... with builtins ...
1235 call mkdir foo
1236 echo %ErrorLevel%
1237 if exist foo (echo foo created) else echo foo should exist!
1238 rmdir foo
1239 set FOOBAZ_VAR=foobaz
1240 call echo Should expand %FOOBAZ_VAR%
1241 set FOOBAZ_VAR=
1242 echo>batfile
1243 call dir /b
1244 echo>robinfile
1245 if 1==1 call del batfile
1246 dir /b
1247 if exist batfile echo batfile shouldn't exist
1248 rem ... but not for 'if' or 'for'
1249 call if 1==1 echo bar 2> nul
1250 echo %ErrorLevel%
1251 call :setError 0
1252 call for %%i in (foo bar baz) do echo %%i 2> nul
1253 echo %ErrorLevel%
1254 rem First look for programs in the path before trying a builtin
1255 echo echo non-builtin dir> dir.cmd
1256 call dir /b
1257 cd .. & rd /s/q foobar
1258
1259 echo ------------ Testing SHIFT ------------
1260
1261 call :shiftFun p1 p2 p3 p4 p5
1262 goto :endShiftFun
1263
1264 :shiftFun
1265 echo '%1' '%2' '%3' '%4' '%5'
1266 shift
1267 echo '%1' '%2' '%3' '%4' '%5'
1268 shift@tab@ /1
1269 echo '%1' '%2' '%3' '%4' '%5'
1270 shift /2
1271 echo '%1' '%2' '%3' '%4' '%5'
1272 shift /-1
1273 echo '%1' '%2' '%3' '%4' '%5'
1274 shift /0
1275 echo '%1' '%2' '%3' '%4' '%5'
1276 goto :eof
1277 :endShiftFun
1278
1279 echo ------------ Testing cmd invocation ------------
1280 rem FIXME: only a stub ATM
1281 echo ... a batch file can delete itself ...
1282 echo del foo.cmd>foo.cmd
1283 cmd /q /c foo.cmd
1284 if not exist foo.cmd (
1285     echo file correctly deleted
1286 ) else (
1287     echo file should be deleted!
1288     del foo.cmd
1289 )
1290 echo ... a batch file can alter itself ...
1291 echo echo bar^>foo.cmd>foo.cmd
1292 cmd /q /c foo.cmd > NUL 2>&1
1293 if exist foo.cmd (
1294     type foo.cmd
1295     del foo.cmd
1296 ) else (
1297     echo file not created!
1298 )
1299
1300 echo ------------ Testing setlocal/endlocal ------------
1301 call :setError 0
1302 rem Note: setlocal EnableDelayedExtension already tested in the variable delayed expansion test section
1303 mkdir foobar & cd foobar
1304 echo ...enable/disable extensions
1305 setlocal DisableEXTensions
1306 echo ErrLev: %ErrorLevel%
1307 endlocal
1308 echo ErrLev: %ErrorLevel%
1309 echo @echo off> tmp.cmd
1310 echo echo ErrLev: %%ErrorLevel%%>> tmp.cmd
1311 rem Enabled by default
1312 cmd /C tmp.cmd
1313 cmd /E:OfF /C tmp.cmd
1314 cmd /e:oN /C tmp.cmd
1315
1316 rem FIXME: creating file before setting envvar value to prevent parsing-time evaluation (due to EnableDelayedExpansion not being implemented/available yet)
1317 echo ...setlocal with corresponding endlocal
1318 echo @echo off> test.cmd
1319 echo echo %%VAR%%>> test.cmd
1320 echo setlocal>> test.cmd
1321 echo set VAR=localval>> test.cmd
1322 echo echo %%VAR%%>> test.cmd
1323 echo endlocal>> test.cmd
1324 echo echo %%VAR%%>> test.cmd
1325 set VAR=globalval
1326 call test.cmd
1327 echo %VAR%
1328 set VAR=
1329 echo ...setlocal with no corresponding endlocal
1330 echo @echo off> test.cmd
1331 echo echo %%VAR%%>> test.cmd
1332 echo setlocal>> test.cmd
1333 echo set VAR=localval>> test.cmd
1334 echo echo %%VAR%%>> test.cmd
1335 set VAR=globalval
1336 call test.cmd
1337 echo %VAR%
1338 set VAR=
1339 cd .. & rd /q/s foobar
1340
1341 echo -----------Testing Errorlevel-----------
1342 rem WARNING: Do *not* add tests using ErrorLevel after this section
1343 should_not_exist 2> nul > nul
1344 echo %ErrorLevel%
1345 rem nt 4.0 doesn't really support a way of setting errorlevel, so this is weak
1346 rem See http://www.robvanderwoude.com/exit.php
1347 call :setError 1
1348 echo %ErrorLevel%
1349 if errorlevel 2 echo errorlevel too high, bad
1350 if errorlevel 1 echo errorlevel just right, good
1351 call :setError 0
1352 echo abc%ErrorLevel%def
1353 if errorlevel 1 echo errorlevel nonzero, bad
1354 if not errorlevel 1 echo errorlevel zero, good
1355 rem Now verify that setting a real variable hides its magic variable
1356 set errorlevel=7
1357 echo %ErrorLevel% should be 7
1358 if errorlevel 7 echo setting var worked too well, bad
1359 call :setError 3
1360 echo %ErrorLevel% should still be 7
1361
1362 echo -----------Testing GOTO-----------
1363 if a==a goto dest1
1364 :dest1
1365 echo goto with no leading space worked
1366 if b==b goto dest2
1367  :dest2
1368 echo goto with a leading space worked
1369 if c==c goto dest3
1370         :dest3
1371 echo goto with a leading tab worked
1372 if d==d goto dest4
1373 :dest4@space@
1374 echo goto with a following space worked
1375
1376 echo ---------- Testing combined CALLs/GOTOs -----------
1377 echo @echo off>foo.cmd
1378 echo goto :eof>>foot.cmd
1379 echo :eof>>foot.cmd
1380 echo echo world>>foo.cmd
1381
1382 echo @echo off>foot.cmd
1383 echo echo cheball>>foot.cmd
1384 echo.>>foot.cmd
1385 echo call :bar>>foot.cmd
1386 echo if "%%1"=="deleteMe" (del foot.cmd)>>foot.cmd
1387 echo goto :eof>>foot.cmd
1388 echo.>>foot.cmd
1389 echo :bar>>foot.cmd
1390 echo echo barbare>>foot.cmd
1391 echo goto :eof>>foot.cmd
1392
1393 call foo.cmd
1394 call foot
1395 call :bar
1396 del foo.cmd
1397 rem Script execution stops after the following line
1398 foot deleteMe
1399 call :foo
1400 call :foot
1401 goto :endFuns
1402
1403 :foot
1404 echo foot
1405
1406 :foo
1407 echo foo
1408 goto :eof
1409
1410 :endFuns
1411
1412 :bar
1413 echo bar
1414 call :foo
1415
1416 :baz
1417 echo baz
1418 goto :eof
1419
1420 echo Final message is not output since earlier 'foot' processing stops script execution
1421 echo Do NOT add any tests below this line
1422
1423 echo -----------Done, jumping to EOF-----------
1424 goto :eof
1425 rem Subroutine to set errorlevel and return
1426 rem in windows nt 4.0, this always sets errorlevel 1, since /b isn't supported
1427 :setError
1428 exit /B %1
1429 rem This line runs under cmd in windows NT 4, but not in more modern versions.