wscript: Implemented Host_put_Interactive.
[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 word@space@
19 echo word@space@@space@
20  echo word
21 echo@tab@word
22 echo@tab@word @tab@
23 echo@tab@word@tab@@space@
24 @tab@echo word
25 echo @tab@word
26 echo  @tab@word
27 echo@tab@@tab@word
28
29 @echo off
30 echo ------------ Testing 'echo' [OFF] --------------
31 echo word
32 echo 'singlequotedword'
33 echo "doublequotedword"
34 @echo at-echoed-word
35 echo "/?"
36 echo.
37 echo .
38 echo.word
39 echo .word
40 echo:
41 echo :
42 echo:word
43 echo :word
44 echo word@space@
45 echo word@space@@space@
46  echo word
47 echo@tab@word
48 echo@tab@word @tab@
49 echo@tab@word@tab@@space@
50 @tab@echo word
51 echo @tab@word
52 echo  @tab@word
53 echo@tab@@tab@word
54
55 echo ------------ Testing redirection operators --------------
56 mkdir foobar & cd foobar
57 echo ...stdout redirection
58 echo foo>foo
59 type foo
60 echo foo 1> foo
61 type foo
62 echo foo1> foo
63 type foo
64 echo foo11> foo
65 type foo
66 echo foo12> foo
67 type foo
68 echo ...stdout appending
69 echo foo>foo
70 echo foo >>foo
71 type foo
72 del foo
73 echo foob >> foo
74 type foo
75 echo fooc 1>>foo
76 type foo
77 echo food1>>foo
78 type foo
79 echo food2>>foo
80 type foo
81 del foo
82 echo food21>>foo
83 type foo
84 cd ..
85 rd /s/q foobar
86
87 echo ------------ Testing ^^ escape character --------------
88 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
89 echo ^hell^o, world
90 echo hell^o, world
91 echo hell^^o, world
92 echo hell^^^o, world
93 mkdir foobar
94 echo baz> foobar\baz
95 type foobar\baz
96 type foobar^\baz
97 rd /s/q foobar
98 echo foo ^| echo bar
99 echo foo ^& echo bar
100 call :setError 0
101 echo bak ^&& echo baz 2> nul
102 echo %ErrorLevel%
103 echo foo ^> foo
104 echo ^<> foo
105 type foo
106 del foo
107 set FOO=oof
108 echo ff^%FOO%
109 set FOO=bar ^| baz
110 set FOO
111 rem FIXME: echoing %FOO% gives an error (baz not recognized) but prematurely
112 rem exits the script on windows; redirecting stdout and/or stderr doesn't help
113 echo %ErrorLevel%
114 call :setError 0
115 set FOO=bar ^^^| baz
116 set FOO
117 echo %FOO%
118 echo %ErrorLevel%
119 set FOO=
120
121 echo ------------ Testing 'set' --------------
122 call :setError 0
123 set FOOBAR 2> nul > nul
124 echo %ErrorLevel%
125 set FOOBAR =  baz
126 echo %ErrorLevel%
127 echo %FOOBAR%FOOBAR not defined
128 echo %FOOBAR %
129 set FOOBAR 2> nul
130 set FOOBAR =  baz2
131 echo %ErrorLevel%
132 echo %fOObAr %
133 set FOOBAR= bar
134 echo %ErrorLevel%
135 echo %FOOBAR%
136 set FOO
137 set FOOBAR=
138 set FOOB
139 echo %FOOBAR%FOOBAR not defined
140 set FOOBAR =
141 set FOOBA 2> nul > nul
142 echo %ErrorLevel%
143 set FOO=bar
144 echo %FOO%
145 set FOO=foo
146 set BAR=bar
147 echo %FOO%%BAR%
148 set BAR=
149 set FOO=
150 set FOO=%FOO%
151 echo %FOO%FOO not defined
152 set BAZ%=bazbaz
153 set BA
154 echo %BAZ%%
155 set BAZ%=
156 echo set "FOO=bar" should not include the quotes in the variable value
157 set "FOO=bar"
158 echo %FOO%
159 set@tab@FOO=foo
160 echo %FOO%
161 set@tab@FOO=
162 echo '%FOO%'
163 set FOO=foo@space@
164 echo '%FOO%'
165 set FOO=foo@tab@
166 echo '%FOO%'
167 set FOO=
168
169 echo ------------ Testing variable expansion --------------
170 call :setError 0
171 echo ~dp0 should be directory containing batch file
172 echo %~dp0
173 mkdir dummydir
174 cd dummydir
175 echo %~dp0
176 cd ..
177 rmdir dummydir
178 echo CD value %CD%
179 echo %%
180 echo P%
181 echo %P
182 echo %UNKNOWN%S
183 echo P%UNKNOWN%
184 echo P%UNKNOWN%S
185 echo %ERRORLEVEL
186 echo %ERRORLEVEL%
187 echo %ERRORLEVEL%%ERRORLEVEL%
188 echo %ERRORLEVEL%ERRORLEVEL%
189 echo %ERRORLEVEL%%
190 echo %ERRORLEVEL%%%
191 echo P%ERRORLEVEL%
192 echo %ERRORLEVEL%S
193 echo P%ERRORLEVEL%S
194
195 echo ------------ Testing variable delayed expansion --------------
196 rem NT4 doesn't support this
197 echo ...default mode (load-time expansion)
198 set FOO=foo
199 echo %FOO%
200 echo !FOO!
201 if %FOO% == foo (
202     set FOO=bar
203     if %FOO% == bar (echo bar) else echo foo
204 )
205
206 set FOO=foo
207 if %FOO% == foo (
208     set FOO=bar
209     if !FOO! == bar (echo bar) else echo foo
210 )
211
212 echo ...runtime (delayed) expansion mode
213 setlocal EnableDelayedExpansion
214 set FOO=foo
215 echo %FOO%
216 echo !FOO!
217 if %FOO% == foo (
218     set FOO=bar
219     if %FOO% == bar (echo bar) else echo foo
220 )
221
222 set FOO=foo
223 if %FOO% == foo (
224     set FOO=bar
225     if !FOO! == bar (echo bar) else echo foo
226 )
227 echo %ErrorLevel%
228 setlocal DisableDelayedExpansion
229 echo %ErrorLevel%
230 set FOO=foo
231 echo %FOO%
232 echo !FOO!
233 set FOO=
234 echo ...using /V cmd flag
235 echo @echo off> tmp.cmd
236 echo set FOO=foo>> tmp.cmd
237 echo echo %%FOO%%>> tmp.cmd
238 echo echo !FOO!>> tmp.cmd
239 echo set FOO=>> tmp.cmd
240 cmd /V:ON /C tmp.cmd
241 cmd /V:OfF /C tmp.cmd
242 del tmp.cmd
243
244 echo ------------ Testing conditional execution --------------
245 echo ...unconditional ^&
246 call :setError 123 & echo foo1
247 echo bar2 & echo foo2
248 mkdir foobar & cd foobar
249 echo > foobazbar
250 cd .. & rd /s/q foobar
251 if exist foobazbar (
252     echo foobar not deleted!
253     cd ..
254     rd /s/q foobar
255 ) else echo foobar deleted
256 echo ...on success conditional ^&^&
257 call :setError 456 && echo foo3 > foo3
258 if exist foo3 (
259     echo foo3 created
260     del foo3
261 ) else echo foo3 not created
262 echo bar4 && echo foo4
263 echo ...on failure conditional ^|^|
264 call :setError 789 || echo foo5
265 echo foo6 || echo bar6 > bar6
266 if exist bar6 (
267     echo bar6 created
268     del bar6
269 )
270
271 echo ------------ Testing cd ------------
272 mkdir foobar
273 cd foobar
274 echo blabla > singleFile
275 dir /b
276 echo Current dir: %CD%
277 cd
278 cd ..
279 cd
280 cd foobar@space@
281 cd
282 cd ..
283 cd
284 cd @space@foobar
285 cd
286 cd..
287 cd
288 cd foobar
289 cd..@space@
290 cd
291 if not exist foobar (cd ..)
292 cd foobar
293 cd@tab@..@tab@@space@@tab@
294 cd
295 if not exist foobar (cd ..)
296 cd foobar
297 mkdir "bar bak"
298 cd "bar bak"
299 cd
300 cd ..
301 cd bar bak
302 cd
303 cd "bar bak@space@"@tab@@space@
304 cd
305 cd ..\..
306 cd
307 rd /Q/s foobar
308
309 echo ------------ Testing type ------------
310 echo bar> foobaz
311 @echo on
312 type foobaz
313 echo ***
314 @echo off
315 type foobaz@tab@
316 echo ***
317 del foobaz
318
319 echo ------------ Testing NUL ------------
320 md foobar & cd foobar
321 rem NUL file (non) creation + case insensitivity
322 rem Note: "if exist" does not work with NUL, so to check for file existence we use a kludgy workaround
323 echo > bar
324 echo foo > NUL
325 dir /b /a-d
326 echo foo > nul
327 dir /b /a-d
328 echo foo > NuL
329 @tab@dir /b@tab@/a-d
330 del bar
331 rem NUL not special everywhere
332 call :setError 123
333 echo NUL> foo
334 if not exist foo (echo foo should have been created) else (
335     type foo
336     del foo
337 )
338 rem Empty file creation
339 copy nul foo > nul
340 if exist foo (
341     echo foo created
342     del foo
343     type foo
344 ) else (
345     echo ***
346 )
347 cd ..
348 rd foobar
349
350 echo ------------ Testing if/else --------------
351 echo if/else should work with blocks
352 if 0 == 0 (
353   echo if seems to work
354 ) else (
355   echo if seems to be broken
356 )
357 if 1 == 0 (
358   echo else seems to be broken
359 ) else (
360   echo else seems to work
361 )
362 if /c==/c (
363   echo if seems not to detect /c as parameter
364 ) else (
365   echo parameter detection seems to be broken
366 )
367 echo Testing case sensitivity with and without /i option
368 if bar==BAR echo if does not default to case sensitivity
369 if not bar==BAR echo if seems to default to case sensitivity
370 if /i foo==FOO echo if /i seems to work
371 if /i not foo==FOO echo if /i seems to be broken
372 if /I foo==FOO echo if /I seems to work
373 if /I not foo==FOO echo if /I seems to be broken
374
375 echo -----------Testing for -----------
376 echo ...plain FOR
377 for %%i in (A B C) do echo %%i
378 for %%i in (A B C) do echo %%I
379 for %%i in (A B C) do echo %%j
380 for %%i in (A B C) do call :forTestFun1 %%i
381 for %%i in (1,4,1) do echo %%i
382 for %%i in (A, B,C) do echo %%i
383 for %%i in  (X) do echo %%i
384 for@tab@%%i in  (X2) do echo %%i
385 for %%i in@tab@(X3) do echo %%i
386 for %%i in (@tab@ foo@tab@) do echo %%i
387 for@tab@ %%i in@tab@(@tab@M) do echo %%i
388 for %%i@tab@in (X)@tab@do@tab@echo %%i
389 for@tab@ %%j in@tab@(@tab@M, N, O@tab@) do echo %%j
390 goto :endForTestFun1
391 :forTestFun1
392 echo %1
393 goto :eof
394 :endForTestFun1
395 echo ...imbricated FORs
396 for %%i in (X) do (
397     for %%j in (Y) do (
398         echo %%i %%j))
399 for %%i in (X) do (
400     for %%I in (Y) do (
401         echo %%i %%I))
402 for %%i in (A B) do (
403     for %%j in (C D) do (
404         echo %%i %%j))
405 for %%i in (A B) do (
406     for %%j in (C D) do (
407         call :forTestFun2 %%i %%j ))
408 goto :endForTestFun2
409 :forTestFun2
410 echo %1 %2
411 goto :eof
412 :endForTestFun2
413 mkdir foobar & cd foobar
414 mkdir foo
415 mkdir bar
416 mkdir baz
417 echo > bazbaz
418 echo ...basic wildcards
419 for %%i in (ba*) do echo %%i
420 echo ...for /d
421 for /d %%i in (baz foo bar) do echo %%i
422 rem FIXME for /d incorrectly parses when wildcards are used
423 rem for /d %%i in (bazb*) do echo %%i
424 rem FIXME can't test wildcard expansion here since it's listed in directory
425 rem order, and not in alphabetic order.
426 rem Proper testing would need a currently missing "sort" program implementation.
427 rem for /d %%i in (ba*) do echo %%i>> tmp
428 rem sort < tmp
429 rem del tmp
430 rem for /d %%i in (?a*) do echo %%i>> tmp
431 rem sort < tmp
432 rem del tmp
433 rem for /d %%i in (*) do echo %%i>> tmp
434 rem sort < tmp
435 rem del tmp
436 cd ..
437 rd /s/Q foobar
438 echo ...for /L
439 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
440 for /L %%i in (1,2,0) do echo %%i
441 for /L %%i in (1,2,6) do echo %%i
442 for /l %%i in (1 ,2,6) do echo %%i
443 for /L %%i in (a,2,3) do echo %%i
444 for /L %%i in (1,2,-1) do echo %%i
445 for /L %%i in (-4,-1,-1) do echo %%i
446 for /L %%i in (1,-2,-2) do echo %%i
447 for /L %%i in (1,2,a) do echo %%i
448 echo ErrorLevel %ErrorLevel%
449 for /L %%i in (1,a,b) do echo %%i
450 echo ErrorLevel %ErrorLevel%
451 rem FIXME: following test cases cannot be currently tested due to an inconsistent/buggy 'for /L' parsing.
452 rem for /L %%i in (a,2,b) do echo %%i
453 rem for /L %%i in (1,1,1) do echo %%i
454 rem for /L %%i in (1,-2,-1) do echo %%i
455 rem for /L %%i in (-1,-1,-1) do echo %%i
456 rem for /L %%i in (1,2, 3) do echo %%i
457 echo ...for /a
458 rem No output when using "set expr" syntax, unless in interactive mode
459 rem Need to use "set envvar=expr" to use in a batch script
460 echo ......individual operations
461 set var=0
462 set /a var=1 +2 & echo %var%
463 set /a var=1 +-2 & echo %var%
464 set /a var=1 --2 & echo %var%
465 set /a var=2* 3 & echo %var%
466 set /a var=-2* -5 & echo %var%
467 set /a var=12/3 & echo %var%
468 set /a var=13/3 & echo %var%
469 set /a var=-13/3 & echo %var%
470 rem FIXME Divide by zero should return an error, but error messages cannot be tested with current infrastructure
471 set /a var=5 %% 5 & echo %var%
472 set /a var=5 %% 3 & echo %var%
473 set /a var=5 %% -3 & echo %var%
474 set /a var=-5 %% -3 & echo %var%
475 set /a var=1 ^<^< 0 & echo %var%
476 set /a var=1 ^<^< 2 & echo %var%
477 set /a var=1 ^<^< -2 & echo %var%
478 set /a var=-1 ^<^< -2 & echo %var%
479 set /a var=-1 ^<^< 2 & echo %var%
480 set /a var=9 ^>^> 0 & echo %var%
481 set /a var=9 ^>^> 2 & echo %var%
482 set /a var=9 ^>^> -2 & echo %var%
483 set /a var=-9 ^>^> -2 & echo %var%
484 set /a var=-9 ^>^> 2 & echo %var%
485 set /a var=5 ^& 0 & echo %var%
486 set /a var=5 ^& 1 & echo %var%
487 set /a var=5 ^& 3 & echo %var%
488 set /a var=5 ^& 4 & echo %var%
489 set /a var=5 ^& 1 & echo %var%
490 set /a var=5 ^| 0 & echo %var%
491 set /a var=5 ^| 1 & echo %var%
492 set /a var=5 ^| 3 & echo %var%
493 set /a var=5 ^| 4 & echo %var%
494 set /a var=5 ^| 1 & echo %var%
495 set /a var=5 ^^ 0 & echo %var%
496 set /a var=5 ^^ 1 & echo %var%
497 set /a var=5 ^^ 3 & echo %var%
498 set /a var=5 ^^ 4 & echo %var%
499 set /a var=5 ^^ 1 & echo %var%
500 echo ......precedence and grouping
501 set /a var=4 + 2*3 & echo %var%
502 set /a var=(4+2)*3 & echo %var%
503 set /a var=4 * 3/5 & echo %var%
504 set /a var=(4 * 3)/5 & echo %var%
505 set /a var=4 * 5 %% 4 & echo %var%
506 set /a var=4 * (5 %% 4) & echo %var%
507 set /a var=3 %% (5 + 8 %% 3 ^^ 2) & echo %var%
508 set /a var=3 %% (5 + 8 %% 3 ^^ -2) & echo %var%
509 echo ......octal and hexadecimal
510 set /a var=0xf + 3 & echo %var%
511 set /a var=0xF + 3 & echo %var%
512 set /a var=015 + 2 & echo %var%
513 set /a var=3, 8+3,0 & echo %var%
514 echo ......variables
515 set /a var=foo=3, foo+1 & echo %var%
516 if defined foo (echo %foo%) else (
517     echo foo not defined
518 )
519 set /a var=foo=3, foo+=1 & echo %var%
520 set /a var=foo=3, bar=1, bar+=foo, bar & echo %var%
521 set /a var=foo*= foo & echo %var%
522 set /a var=whateverNonExistingVar & echo %var%
523 set /a var=whateverNonExistingVar + bar & echo %var%
524 set /a var=foo -= foo + 7 & echo %var%
525 set /a var=foo /= 3 + 2 & echo %var%
526 set /a var=foo=5, foo %%=2 & echo %var%
527 set /a var=foo ^<^<= 2 & echo %var%
528 set /a var=foo ^>^>= 2 & echo %var%
529 set /a var=foo ^&= 2 & echo %var%
530 set /a var=foo=5, foo ^|= 2 & echo %var%
531 set /a var=foo=5, foo ^^= 2 & echo %var%
532 set /a var=foo=19, foo %%= 4 + (bar %%= 7) & echo.
533 set foo=
534 set bar=
535 set var=
536
537 echo -----------Testing del /a-----------
538 del /f/q *.test > nul
539 echo r > r.test
540 attrib +r r.test
541 echo not-r > not-r.test
542
543 if not exist not-r.test echo not-r.test not found before delete, bad
544 del /a:-r *.test
545 if not exist not-r.test echo not-r.test not found after delete, good
546
547 if not exist r.test echo r.test not found before delete, bad
548 if exist r.test echo r.test found before delete, good
549 del /a:r *.test
550 if not exist r.test echo r.test not found after delete, good
551 if exist r.test echo r.test found after delete, bad
552
553 echo ------------ Testing del /q --------------
554 mkdir del_q_dir
555 cd del_q_dir
556 echo abc > file1
557 echo abc > file2.dat
558 rem If /q doesn't work, cmd will prompt and the test case should hang
559 del /q * > nul
560 for %%a in (1 2.dat) do if exist file%%a echo del /q * failed on file%%a
561 for %%a in (1 2.dat) do if not exist file%%a echo del /q * succeeded on file%%a
562 cd ..
563 rmdir del_q_dir
564
565 echo ------------ Testing del /s --------------
566 mkdir "foo bar"
567 cd "foo bar"
568 echo hi > file1.dat
569 echo there > file2.dat
570 echo bub > file3.dat
571 echo bye > "file with spaces.dat"
572 cd ..
573 del /s file1.dat > nul
574 del file2.dat /s > nul
575 del "file3.dat" /s > nul
576 del "file with spaces.dat" /s > nul
577 cd "foo bar"
578 for %%f in (1 2 3) do if exist file%%f.dat echo Del /s failed on file%%f
579 for %%f in (1 2 3) do if exist file%%f.dat del file%%f.dat
580 if exist "file with spaces.dat" echo Del /s failed on "file with spaces.dat"
581 if exist "file with spaces.dat" del "file with spaces.dat"
582 cd ..
583 rmdir "foo bar"
584
585 echo ----------- Testing mkdir -----------
586 call :setError 0
587 rem md and mkdir are synonymous
588 mkdir foobar
589 echo %ErrorLevel%
590 rmdir foobar
591 md foobar
592 echo %ErrorLevel%
593 rmdir foobar
594 rem Creating an already existing directory/file must fail
595 mkdir foobar
596 md foobar
597 echo %ErrorLevel%
598 rmdir foobar
599 echo > foobar
600 mkdir foobar
601 echo %ErrorLevel%
602 del foobar
603 rem Multi-level path creation
604 mkdir foo
605 echo %ErrorLevel%
606 mkdir foo\bar\baz
607 echo %ErrorLevel%
608 cd foo
609 echo %ErrorLevel%
610 cd bar
611 echo %ErrorLevel%
612 cd baz
613 echo %ErrorLevel%
614 echo > ..\..\bar2
615 mkdir ..\..\..\foo\bar2
616 echo %ErrorLevel%
617 del ..\..\bar2
618 mkdir ..\..\..\foo\bar2
619 echo %ErrorLevel%
620 rmdir ..\..\..\foo\bar2
621 cd ..
622 rmdir baz
623 cd ..
624 rmdir bar
625 cd ..
626 rmdir foo
627 echo %ErrorLevel%
628 rem Trailing backslashes
629 mkdir foo\\\\
630 echo %ErrorLevel%
631 if exist foo (rmdir foo & echo dir created
632 ) else ( echo dir not created )
633 echo %ErrorLevel%
634 rem Invalid chars
635 mkdir ?
636 echo mkdir ? gives errorlevel %ErrorLevel%
637 call :setError 0
638 mkdir ?\foo
639 echo mkdir ?\foo gives errorlevel %ErrorLevel%
640 call :setError 0
641 mkdir foo\?
642 echo mkdir foo\? gives errorlevel %ErrorLevel%
643 if exist foo (rmdir foo & echo ok, foo created
644 ) else ( echo foo not created )
645 call :setError 0
646 mkdir foo\bar\?
647 echo mkdir foo\bar\? gives errorlevel %ErrorLevel%
648 call :setError 0
649 if not exist foo (
650     echo bad, foo not created
651 ) else (
652     cd foo
653     if exist bar (
654         echo ok, foo\bar created
655         rmdir bar
656     )
657     cd ..
658     rmdir foo
659 )
660 rem multiples directories at once
661 mkdir foobaz & cd foobaz
662 mkdir foo bar\baz foobar
663 if exist foo (echo foo created) else echo foo not created!
664 if exist bar (echo bar created) else echo bar not created!
665 if exist foobar (echo foobar created) else echo foobar not created!
666 if exist bar\baz (echo bar\baz created) else echo bar\baz not created!
667 cd ..
668 rd /s/q foobaz
669 call :setError 0
670 mkdir foo\*
671 echo mkdir foo\* errorlevel %ErrorLevel%
672 if exist foo (rmdir foo & echo ok, foo created
673 ) else ( echo bad, foo not created )
674
675 echo ----------- Testing rmdir -----------
676 call :setError 0
677 rem rd and rmdir are synonymous
678 mkdir foobar
679 rmdir foobar
680 echo %ErrorLevel%
681 if not exist foobar echo dir removed
682 mkdir foobar
683 rd foobar
684 echo %ErrorLevel%
685 if not exist foobar echo dir removed
686 rem Removing nonexistent directory
687 rmdir foobar
688 echo %ErrorLevel%
689 rem Removing single-level directories
690 echo > foo
691 rmdir foo
692 echo %ErrorLevel%
693 if exist foo echo file not removed
694 del foo
695 mkdir foo
696 echo > foo\bar
697 rmdir foo
698 echo %ErrorLevel%
699 if exist foo echo non-empty dir not removed
700 del foo\bar
701 mkdir foo\bar
702 rmdir foo
703 echo %ErrorLevel%
704 if exist foo echo non-empty dir not removed
705 rmdir foo\bar
706 rmdir foo
707 rem Recursive rmdir
708 mkdir foo\bar\baz
709 rmdir /s /Q foo
710 if not exist foo (
711     echo recursive rmdir succeeded
712 ) else (
713     rd foo\bar\baz
714     rd foo\bar
715     rd foo
716 )
717 mkdir foo\bar\baz
718 echo foo > foo\bar\brol
719 rmdir /s /Q foo
720 if not exist foo (
721     echo recursive rmdir succeeded
722 ) else (
723     rd foo\bar\baz
724     del foo\bar\brol
725     rd foo\bar
726     rd foo
727 )
728 rem multiples directories at once
729 mkdir foobaz & cd foobaz
730 mkdir foo
731 mkdir bar\baz
732 mkdir foobar
733 rd /s/q foo bar foobar
734 if not exist foo (echo foo removed) else echo foo not removed!
735 if not exist bar (echo bar removed) else echo bar not removed!
736 if not exist foobar (echo foobar removed) else echo foobar not removed!
737 if not exist bar\baz (echo bar\baz removed) else echo bar\baz not removed!
738 cd ..
739 rd /s/q foobaz
740
741 echo ------------ Testing CALL --------------
742 mkdir foobar & cd foobar
743 rem External script
744 echo echo foo %%1> foo.cmd
745 call foo
746 call foo.cmd 8
747 echo echo %%1 %%2 > foo.cmd
748 call foo.cmd foo
749 call foo.cmd foo bar
750 call foo.cmd foo ""
751 call foo.cmd "" bar
752 call foo.cmd foo ''
753 call foo.cmd '' bar
754 del foo.cmd
755 rem Internal routines
756 call :testRoutine :testRoutine
757 goto :endTestRoutine
758 :testRoutine
759 echo bar %1
760 goto :eof
761 :endTestRoutine
762
763 call :testRoutineArgs foo
764 call :testRoutineArgs foo bar
765 call :testRoutineArgs foo ""
766 call :testRoutineArgs ""  bar
767 call :testRoutineArgs foo ''
768 call :testRoutineArgs ''  bar
769 goto :endTestRoutineArgs
770 :testRoutineArgs
771 echo %1 %2
772 goto :eof
773 :endTestRoutineArgs
774
775 rem Should work for builtins...
776 call mkdir foo
777 echo %ErrorLevel%
778 if exist foo (echo foo created) else echo foo should exist!
779 rmdir foo
780 set FOOBAZ_VAR=foobaz
781 call echo Should expand %FOOBAZ_VAR%
782 set FOOBAZ_VAR=
783 echo>batfile
784 call dir /b
785 echo>robinfile
786 if 1==1 call del batfile
787 dir /b
788 if exist batfile echo batfile shouldn't exist
789 rem ... but not for 'if' or 'for'
790 call if 1==1 echo bar 2> nul
791 echo %ErrorLevel%
792 call :setError 0
793 call for %%i in (foo bar baz) do echo %%i 2> nul
794 echo %ErrorLevel%
795 rem First look for programs in the path before trying a builtin
796 echo echo non-builtin dir> dir.cmd
797 call dir /b
798 cd ..
799 rd /s/q foobar
800
801 echo ------------ Testing setlocal/endlocal ------------
802 call :setError 0
803 rem Note: setlocal EnableDelayedExtension already tested in the variable delayed expansion test section
804 mkdir foobar & cd foobar
805 echo ...enable/disable extensions
806 setlocal DisableEXTensions
807 echo ErrLev: %ErrorLevel%
808 endlocal
809 echo ErrLev: %ErrorLevel%
810 echo @echo off> tmp.cmd
811 echo echo ErrLev: %%ErrorLevel%%>> tmp.cmd
812 rem Enabled by default
813 cmd /C tmp.cmd
814 cmd /E:OfF /C tmp.cmd
815 cmd /e:oN /C tmp.cmd
816
817 rem FIXME: creating file before setting envvar value to prevent parsing-time evaluation (due to EnableDelayedExpansion not being implemented/available yet)
818 echo ...setlocal with corresponding endlocal
819 echo @echo off> test.cmd
820 echo echo %%VAR%%>> test.cmd
821 echo setlocal>> test.cmd
822 echo set VAR=localval>> test.cmd
823 echo echo %%VAR%%>> test.cmd
824 echo endlocal>> test.cmd
825 echo echo %%VAR%%>> test.cmd
826 set VAR=globalval
827 call test.cmd
828 echo %VAR%
829 set VAR=
830 echo ...setlocal with no corresponding endlocal
831 echo @echo off> test.cmd
832 echo echo %%VAR%%>> test.cmd
833 echo setlocal>> test.cmd
834 echo set VAR=localval>> test.cmd
835 echo echo %%VAR%%>> test.cmd
836 set VAR=globalval
837 call test.cmd
838 echo %VAR%
839 set VAR=
840 cd ..
841 rd /q/s foobar
842
843 echo -----------Testing Errorlevel-----------
844 rem WARNING: Do *not* add tests using ErrorLevel after this section
845 should_not_exist 2> nul > nul
846 echo %ErrorLevel%
847 rem nt 4.0 doesn't really support a way of setting errorlevel, so this is weak
848 rem See http://www.robvanderwoude.com/exit.php
849 call :setError 1
850 echo %ErrorLevel%
851 if errorlevel 2 echo errorlevel too high, bad
852 if errorlevel 1 echo errorlevel just right, good
853 call :setError 0
854 echo abc%ErrorLevel%def
855 if errorlevel 1 echo errorlevel nonzero, bad
856 if not errorlevel 1 echo errorlevel zero, good
857 rem Now verify that setting a real variable hides its magic variable
858 set errorlevel=7
859 echo %ErrorLevel% should be 7
860 if errorlevel 7 echo setting var worked too well, bad
861 call :setError 3
862 echo %ErrorLevel% should still be 7
863
864 echo -----------Testing GOTO-----------
865 if a==a goto dest1
866 :dest1
867 echo goto with no leading space worked
868 if b==b goto dest2
869  :dest2
870 echo goto with a leading space worked
871 if c==c goto dest3
872         :dest3
873 echo goto with a leading tab worked
874 if d==d goto dest4
875 :dest4@space@
876 echo goto with a following space worked
877
878 echo -----------Done, jumping to EOF-----------
879 goto :eof
880 rem Subroutine to set errorlevel and return
881 rem in windows nt 4.0, this always sets errorlevel 1, since /b isn't supported
882 :setError
883 exit /B %1
884 rem This line runs under cmd in windows NT 4, but not in more modern versions.