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