1 echo Tests
for cmd's builtin commands
4 echo ------------ Testing 'echo' [ON] --------------
6 echo 'singlequotedword
'
7 echo "doublequotedword"
20 echo word@space@@space@
24 echo@tab@word@tab@@space@
31 echo ------------ Testing 'echo' [OFF] --------------
33 echo 'singlequotedword
'
34 echo "doublequotedword"
47 echo word@space@@space@
51 echo@tab@word@tab@@space@
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
68 echo ------------ Testing rem --------------
73 rem echo foo & echo bar
76 rem@tab@echo foo & echo bar
82 rem echo foo & echo bar
85 rem@tab@echo foo & echo bar
88 echo ------------ Testing redirection operators --------------
89 mkdir foobar & cd foobar
90 echo ...stdout redirection
99 echo foo@tab@1>@tab@foo
114 echo ...stdout appending
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
137 if 1==1 (echo foo2>bar) else echo baz2>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
143 if 1==0 (echo foo5>bar) else echo baz5>bar
145 if 1==0 (echo foo6) else echo baz6 1>bar
147 if 1==0 (echo foo7 1>bar) else echo baz7>bar
149 if 1==0 (echo foo8 1>bar) else echo baz8>bak
151 if 1==1 (echo foo>bar & echo baz)
158 (if 1==1 (echo A) else echo B) > C
160 (if 1==0 (echo A) else echo B) > C
162 (if 1==0 (echo A > B) else echo C)
163 cd .. & rd /s/q foobar
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
179 echo bak ^
&& echo baz
2> nul
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
199 echo ------------ Testing
'set' --------------
201 set FOOBAR
2> nul
> nul
205 echo %FOOBAR%FOOBAR
not defined
217 echo %FOOBAR%FOOBAR
not defined
219 set FOOBA
2> nul
> nul
229 echo %FOO%FOO
not defined
234 echo set "FOO=bar" should
not include the quotes in the variable value
247 echo ------------ Testing variable expansion
--------------
249 echo ~dp0 should be directory containing batch file
265 echo %ERRORLEVEL%%ERRORLEVEL%
266 echo %ERRORLEVEL%ERRORLEVEL%
273 echo ------------ Testing variable substrings
--------------
286 echo ------------ Testing variable substitution
--------------
287 echo ...in
FOR variables
288 for %%i in
("A B" C
) do echo %%i
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
294 for %%i in
("F G" H
) do echo %%~di
296 for %%d in
("I J" K
) do echo %%~pd
298 for %%i in
("L M" N
) do echo %%~ni
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'
304 for %%i in
("U V" W
) do echo '%%~ai'
306 for %%i in
(foo
) do echo '%%~ai'
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'
312 rem Similar issues as above
313 for %%i in
("a b" c
) do echo '%%~zi'
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'
320 echo ...in parameters
321 for %%i in
("A B" C
) do call :echoFun %%i
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
327 for %%i in
("F G" H
) do call :echoFunD %%i
329 for %%d in
("I J" K
) do call :echoFunP %%d
331 for %%i in
("L M" N
) do call :echoFunN %%i
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
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
373 rem some NT4 workaround
396 echo ------------ Testing variable delayed expansion
--------------
397 rem NT4 doesn't support this
398 echo ...default
mode (load
-time expansion
)
404 if %FOO% == bar
(echo bar
) else echo foo
410 if !FOO
! == bar
(echo bar
) else echo foo
413 echo ...runtime
(delayed
) expansion
mode
414 setlocal EnableDelayedExpansion
420 if %FOO% == bar
(echo bar
) else echo foo
426 if !FOO
! == bar
(echo bar
) else echo foo
429 setlocal DisableDelayedExpansion
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
442 cmd /V
:OfF /C tmp.
cmd
445 echo ------------ Testing conditional execution
--------------
446 echo ...unconditional ^
&
447 call :setError 123 & echo foo1
448 echo bar2
& echo foo2
449 mkdir foobar
& cd foobar
451 cd ..
& rd /s
/q foobar
453 echo foobar
not deleted
!
456 ) else echo foobar deleted
457 echo ...on success conditional ^
&^
&
458 call :setError 456 && echo foo3
> 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
472 echo ------------ Testing
cd ------------
475 echo blabla
> singleFile
477 echo Current
dir: %CD%
492 if not exist foobar
(cd ..
)
494 cd@tab@..@tab@@space@@tab@
496 if not exist foobar
(cd ..
)
504 cd "bar bak@space@"@tab@@space@
515 echo ------------ Testing
type ------------
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
537 rem NUL not special everywhere
540 if not exist foo
(echo foo should have been created
) else (
544 rem Empty file creation
555 echo ------------ Testing
if/else --------------
556 echo if/else should work with blocks
558 echo if seems to work
560 echo if seems to be broken
563 echo else seems to be broken
565 echo else seems to work
568 echo if seems
not to detect
/c as parameter
570 echo parameter detection seems to be broken
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 if@tab@
1==1 echo doom
580 if @tab@
1==1 echo doom
581 if 1==1 (echo doom
) else@tab@
echo quake
582 if@tab@
not @tab@
1==@tab@
0 @tab@
echo lol
583 if 1==0@tab@
(echo doom
) else echo quake
584 if 1==0 (echo doom
)@tab@
else echo quake
585 if 1==0 (echo doom
) else@tab@
echo quake
587 echo -----------Testing
for -----------
589 for %%i in
(A B C
) do echo %%i
590 for %%i in
(A B C
) do echo %%I
591 for %%i in
(A B C
) do echo %%j
592 for %%i in
(A B C
) do call :forTestFun1 %%i
593 for %%i in
(1,4,1) do echo %%i
594 for %%i in
(A
, B
,C
) do echo %%i
595 for %%i in
(X
) do echo %%i
596 for@tab@
%%i in
(X2
) do echo %%i
597 for %%i in@tab@
(X3
) do echo %%i
598 for %%i in
(@tab@ foo@tab@
) do echo %%i
599 for@tab@
%%i in@tab@
(@tab@M
) do echo %%i
600 for %%i@tab@in
(X
)@tab@
do@tab@
echo %%i
601 for@tab@
%%j in@tab@
(@tab@M
, N
, O@tab@
) do echo %%j
602 for %%i in
(`
echo A B`
) do echo %%i
603 for %%i in
('echo A B') do echo %%i
604 for %%i in
("echo A B") do echo %%i
605 for %%i in
("A B" C
) do echo %%i
611 echo ...imbricated FORs
618 for %%i in
(A B
) do (
619 for %%j in
(C D
) do (
621 for %%i in
(A B
) do (
622 for %%j in
(C D
) do (
623 call :forTestFun2 %%i
%%j
))
629 mkdir foobar
& cd foobar
634 echo ...basic wildcards
635 for %%i in
(ba
*) do echo %%i
637 for /d
%%i in
(baz foo bar
) do echo %%i
638 rem FIXME for /d incorrectly parses when wildcards are used
639 rem for /d %%i in (bazb*) do echo %%i
640 rem FIXME can't test wildcard expansion here since it's listed in directory
641 rem order, and not in alphabetic order.
642 rem Proper testing would need a currently missing "sort" program implementation.
643 rem for /d %%i in (ba*) do echo %%i>> tmp
646 rem for /d %%i in (?a*) do echo %%i>> tmp
649 rem for /d %%i in (*) do echo %%i>> tmp
652 cd ..
& rd /s
/Q foobar
654 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
655 for /L
%%i in
(1,2,0) do echo %%i
656 for@tab@
/L
%%i in
(1,2,0) do echo %%i
657 for /L
%%i in
(1,2,6) do echo %%i
658 for /l
%%i in
(1 ,2,6) do echo %%i
659 for /L
%%i in
(a
,2,3) do echo %%i
660 for /L
%%i in
(1,2,-1) do echo %%i
661 for /L
%%i in
(-4,-1,-1) do echo %%i
662 for /L
%%i in
(1,-2,-2) do echo %%i
663 for /L
%%i in
(1,2,a
) do echo %%i
664 echo ErrorLevel %ErrorLevel%
665 for /L
%%i in
(1,a
,b
) do echo %%i
666 echo ErrorLevel %ErrorLevel%
667 rem FIXME: following test cases cannot be currently tested due to an inconsistent/buggy 'for /L' parsing.
668 rem for /L %%i in (a,2,b) do echo %%i
669 rem for /L %%i in (1,1,1) do echo %%i
670 rem for /L %%i in (1,-2,-1) do echo %%i
671 rem for /L %%i in (-1,-1,-1) do echo %%i
672 rem for /L %%i in (1,2, 3) do echo %%i
674 rem No output when using "set expr" syntax, unless in interactive mode
675 rem Need to use "set envvar=expr" to use in a batch script
676 echo ......individual operations
678 set /a var
=1 +2 & echo %var%
679 set /a var
=1 +-2 & echo %var%
680 set /a var
=1 --2 & echo %var%
681 set /a var
=2* 3 & echo %var%
682 set /a var
=-2* -5 & echo %var%
683 set /a var
=12/3 & echo %var%
684 set /a var
=13/3 & echo %var%
685 set /a var
=-13/3 & echo %var%
686 rem FIXME Divide by zero should return an error, but error messages cannot be tested with current infrastructure
687 set /a var
=5 %% 5 & echo %var%
688 set /a var
=5 %% 3 & echo %var%
689 set /a var
=5 %% -3 & echo %var%
690 set /a var
=-5 %% -3 & echo %var%
691 set /a var
=1 ^
<^
< 0 & echo %var%
692 set /a var
=1 ^
<^
< 2 & echo %var%
693 set /a var
=1 ^
<^
< -2 & echo %var%
694 set /a var
=-1 ^
<^
< -2 & echo %var%
695 set /a var
=-1 ^
<^
< 2 & echo %var%
696 set /a var
=9 ^
>^
> 0 & echo %var%
697 set /a var
=9 ^
>^
> 2 & echo %var%
698 set /a var
=9 ^
>^
> -2 & echo %var%
699 set /a var
=-9 ^
>^
> -2 & echo %var%
700 set /a var
=-9 ^
>^
> 2 & echo %var%
701 set /a var
=5 ^
& 0 & echo %var%
702 set /a var
=5 ^
& 1 & echo %var%
703 set /a var
=5 ^
& 3 & echo %var%
704 set /a var
=5 ^
& 4 & echo %var%
705 set /a var
=5 ^
& 1 & echo %var%
706 set /a var
=5 ^|
0 & echo %var%
707 set /a var
=5 ^|
1 & echo %var%
708 set /a var
=5 ^|
3 & echo %var%
709 set /a var
=5 ^|
4 & echo %var%
710 set /a var
=5 ^|
1 & echo %var%
711 set /a var
=5 ^^
0 & echo %var%
712 set /a var
=5 ^^
1 & echo %var%
713 set /a var
=5 ^^
3 & echo %var%
714 set /a var
=5 ^^
4 & echo %var%
715 set /a var
=5 ^^
1 & echo %var%
716 echo ......precedence and grouping
717 set /a var
=4 + 2*3 & echo %var%
718 set /a var
=(4+2)*3 & echo %var%
719 set /a var
=4 * 3/5 & echo %var%
720 set /a var
=(4 * 3)/5 & echo %var%
721 set /a var
=4 * 5 %% 4 & echo %var%
722 set /a var
=4 * (5 %% 4) & echo %var%
723 set /a var
=3 %% (5 + 8 %% 3 ^^
2) & echo %var%
724 set /a var
=3 %% (5 + 8 %% 3 ^^
-2) & echo %var%
725 echo ......octal and hexadecimal
726 set /a var
=0xf + 3 & echo %var%
727 set /a var
=0xF + 3 & echo %var%
728 set /a var
=015 + 2 & echo %var%
729 set /a var
=3, 8+3,0 & echo %var%
731 set /a var
=foo
=3, foo
+1 & echo %var%
732 if defined foo
(echo %foo%) else (
735 set /a var
=foo
=3, foo
+=1 & echo %var%
736 set /a var
=foo
=3, bar
=1, bar
+=foo
, bar
& echo %var%
737 set /a var
=foo
*= foo
& echo %var%
738 set /a var
=whateverNonExistingVar
& echo %var%
739 set /a var
=whateverNonExistingVar
+ bar
& echo %var%
740 set /a var
=foo
-= foo
+ 7 & echo %var%
741 set /a var
=foo
/= 3 + 2 & echo %var%
742 set /a var
=foo
=5, foo
%%=2 & echo %var%
743 set /a var
=foo ^
<^
<= 2 & echo %var%
744 set /a var
=foo ^
>^
>= 2 & echo %var%
745 set /a var
=foo ^
&= 2 & echo %var%
746 set /a var
=foo
=5, foo ^|
= 2 & echo %var%
747 set /a var
=foo
=5, foo ^^
= 2 & echo %var%
748 set /a var
=foo
=19, foo
%%= 4 + (bar
%%= 7) & echo.
753 mkdir foobar
& cd foobar
754 echo ......string argument
755 for /F
%%i in
("a b c") do echo %%i
756 for /f
%%i in
("a ") do echo %%i
757 for /f
%%i in
("a") do echo %%i
758 fOr /f
%%i in
(" a") do echo %%i
759 for /f
%%i in
(" a ") do echo %%i
760 echo ......fileset argument
761 echo .........basic blank handling
763 for /f
%%i in
(foo
) do echo %%i
765 for /f
%%i in
(foo
) do echo %%i
767 for /f
%%i in
(foo
) do echo %%i
769 for /f
%%i in
(foo
) do echo %%i
771 for /f
%%i in
(foo
) do echo %%i
773 for /f
%%i in
(foo
) do echo %%i
776 for /f
%%i in
(foo
) do echo %%i
777 echo .........multi
-line with empty lines
784 for /f
%%b in
(foo
) do echo %%b
785 echo .........multiple
files
789 for /f
%%k in
(foo bar
) do echo %%k
790 for /f
%%k in
(bar foo
) do echo %%k
791 rem echo ......command argument
792 rem Not implemented on NT4
793 rem FIXME: Not testable right now in wine: not implemented and would need
794 rem preliminary grep-like program implementation (e.g. like findstr or fc) even
795 rem for a simple todo_wine test
796 rem (for /f "usebackq" %%i in (`echo z a b`) do echo %%i) || echo not supported
797 rem (for /f usebackq %%i in (`echo z a b`) do echo %%i) || echo not supported
798 echo ......eol option
799 for /f
"eol=@" %%i in
(" ad") do echo %%i
800 for /f
"eol=@" %%i in
(" z@y") do echo %%i
801 for /f
"eol=|" %%i in
("a|d") do echo %%i
802 for /f
"eol=@" %%i in
("@y") do echo %%i
> output_file
803 if not exist output_file
(echo no output
) else (del output_file
)
804 for /f
"eol==" %%i in
("=y") do echo %%i
> output_file
805 if not exist output_file
(echo no output
) else (del output_file
)
806 echo ......delims option
807 for /f
"delims=|" %%i in
("a|d") do echo %%i
808 for /f
"delims=|" %%i in
("a |d") do echo %%i
809 for /f
"delims=|" %%i in
("a d|") do echo %%i
810 for /f
"delims=| " %%i in
("a d|") do echo %%i
811 for /f
"delims==" %%i in
("C r=d|") do echo %%i
812 for /f
"delims=" %%i in
("foo bar baz") do echo %%i
813 for /f
"delims=" %%i in
("c:\foo bar baz\..") do echo %%~fi
814 echo ......skip option
818 for /f
"skip=2" %%i in
(foo
) do echo %%i
819 for /f
"skip=3" %%i in
(foo
) do echo %%i
> output_file
820 if not exist output_file
(echo no output
) else (del output_file
)
821 for /f
"skip=4" %%i in
(foo
) do echo %%i
> output_file
822 if not exist output_file
(echo no output
) else (del output_file
)
826 echo -----------Testing
del /a
-----------
827 del /f
/q
*.test
> nul
830 echo not-r
> not-r.test
832 if not exist not-r.test
echo not-r.test
not found before delete
, bad
834 if not exist not-r.test
echo not-r.test
not found after delete
, good
836 if not exist r.test
echo r.test
not found before delete
, bad
837 if exist r.test
echo r.test found before delete
, good
839 if not exist r.test
echo r.test
not found after delete
, good
840 if exist r.test
echo r.test found after delete
, bad
842 echo ------------ Testing
del /q
--------------
847 rem If /q doesn't work, cmd will prompt and the test case should hang
849 for %%a in
(1 2.dat
) do if exist file
%%a
echo del /q
* failed on file
%%a
850 for %%a in
(1 2.dat
) do if not exist file
%%a
echo del /q
* succeeded on file
%%a
854 echo ------------ Testing
del /s
--------------
858 echo there
> file2.dat
860 echo bye
> "file with spaces.dat"
862 del /s file1.dat
> nul
863 del file2.dat
/s
> nul
864 del "file3.dat" /s
> nul
865 del "file with spaces.dat" /s
> nul
867 for %%f in
(1 2 3) do if exist file
%%f.dat
echo Del /s failed on file
%%f
868 for %%f in
(1 2 3) do if exist file
%%f.dat
del file
%%f.dat
869 if exist "file with spaces.dat" echo Del /s failed on
"file with spaces.dat"
870 if exist "file with spaces.dat" del "file with spaces.dat"
874 echo ----------- Testing
mkdir -----------
876 rem md and mkdir are synonymous
883 rem Creating an already existing directory/file must fail
892 rem Multi-level path creation
904 mkdir ..\..\..
\foo
\bar
2
907 mkdir ..\..\..
\foo
\bar
2
909 rmdir ..\..\..
\foo
\bar
2
917 rem Trailing backslashes
920 if exist foo
(rmdir foo
& echo dir created
921 ) else ( echo dir not created
)
925 echo mkdir ? gives
errorlevel %ErrorLevel%
928 echo mkdir ?
\foo gives
errorlevel %ErrorLevel%
931 echo mkdir foo
\? gives
errorlevel %ErrorLevel%
932 if exist foo
(rmdir foo
& echo ok
, foo created
933 ) else ( echo foo
not created
)
936 echo mkdir foo
\bar
\? gives
errorlevel %ErrorLevel%
939 echo bad
, foo
not created
943 echo ok
, foo
\bar created
949 rem multiples directories at once
950 mkdir foobaz
& cd foobaz
951 mkdir foo bar
\baz foobar
952 if exist foo
(echo foo created
) else echo foo
not created
!
953 if exist bar
(echo bar created
) else echo bar
not created
!
954 if exist foobar
(echo foobar created
) else echo foobar
not created
!
955 if exist bar
\baz
(echo bar
\baz created
) else echo bar
\baz
not created
!
956 cd ..
& rd /s
/q foobaz
959 echo mkdir foo\
* errorlevel %ErrorLevel%
960 if exist foo
(rmdir foo
& echo ok
, foo created
961 ) else ( echo bad
, foo
not created
)
963 echo ----------- Testing
rmdir -----------
965 rem rd and rmdir are synonymous
969 if not exist foobar
echo dir removed
973 if not exist foobar
echo dir removed
974 rem Removing nonexistent directory
977 rem Removing single-level directories
981 if exist foo
echo file
not removed
987 if exist foo
echo non
-empty
dir not removed
992 if exist foo
echo non
-empty
dir not removed
999 echo recursive
rmdir succeeded
1006 echo foo
> foo
\bar
\brol
1009 echo recursive
rmdir succeeded
1016 rem multiples directories at once
1017 mkdir foobaz
& cd foobaz
1021 rd /s
/q foo bar foobar
1022 if not exist foo
(echo foo removed
) else echo foo
not removed
!
1023 if not exist bar
(echo bar removed
) else echo bar
not removed
!
1024 if not exist foobar
(echo foobar removed
) else echo foobar
not removed
!
1025 if not exist bar
\baz
(echo bar
\baz removed
) else echo bar
\baz
not removed
!
1026 cd ..
& rd /s
/q foobaz
1028 echo ------------ Testing
attrib --------------
1029 rem FIXME Add tests for archive, hidden and system attributes + mixed attributes modifications
1030 mkdir foobar
& cd foobar
1031 echo foo original contents
> foo
1034 echo ... read
-only attribute
1035 rem Read-only files cannot be altered or deleted, unless forced
1043 echo Read
-only file
not deleted
1045 echo Should
not delete read
-only file
!
1049 echo Read
-only file forcibly deleted
1051 echo Should delete read
-only file with
del /F
!
1055 cd ..
& rd /s
/q foobar
1056 echo ... recursive behaviour
1057 mkdir foobar
\baz
& cd foobar
1063 attrib +R l
*vel?
/S
> nul
2>&1
1069 cd ..
& rd /s
/q foobar
1070 echo ... folders processing
1076 attrib +r baz
/s
/d
> nul
2>&1
1082 rem Oddly windows allows file creation in a read-only directory...
1083 if exist baz\lala
(echo file created in read
-only
dir) else echo file
not created
1084 cd ..
& rd /s
/q foobar
1086 echo ------------ Testing
CALL --------------
1087 mkdir foobar
& cd foobar
1089 echo echo foo
%%1> foo.
cmd
1092 echo echo %%1 %%2 > foo.
cmd
1094 call foo.
cmd foo bar
1100 rem Internal routines
1101 call :testRoutine :testRoutine
1102 goto :endTestRoutine
1108 call :testRoutineArgs foo
1109 call :testRoutineArgs foo bar
1110 call :testRoutineArgs foo
""
1111 call :testRoutineArgs "" bar
1112 call :testRoutineArgs foo
''
1113 call :testRoutineArgs '' bar
1114 goto :endTestRoutineArgs
1120 rem Should work for builtins...
1123 if exist foo
(echo foo created
) else echo foo should
exist!
1125 set FOOBAZ_VAR
=foobaz
1126 call echo Should expand
%FOOBAZ_VAR%
1131 if 1==1 call del batfile
1133 if exist batfile
echo batfile shouldn
't exist
1134 rem ... but not for 'if' or 'for'
1135 call if 1==1 echo bar 2> nul
1138 call for %%i in (foo bar baz) do echo %%i 2> nul
1140 rem First look for programs in the path before trying a builtin
1141 echo echo non-builtin dir> dir.cmd
1143 cd .. & rd /s/q foobar
1145 echo ------------ Testing setlocal/endlocal ------------
1147 rem Note: setlocal EnableDelayedExtension already tested in the variable delayed expansion test section
1148 mkdir foobar & cd foobar
1149 echo ...enable/disable extensions
1150 setlocal DisableEXTensions
1151 echo ErrLev: %ErrorLevel%
1153 echo ErrLev: %ErrorLevel%
1154 echo @echo off> tmp.cmd
1155 echo echo ErrLev: %%ErrorLevel%%>> tmp.cmd
1156 rem Enabled by default
1158 cmd /E:OfF /C tmp.cmd
1159 cmd /e:oN /C tmp.cmd
1161 rem FIXME: creating file before setting envvar value to prevent parsing-time evaluation (due to EnableDelayedExpansion not being implemented/available yet)
1162 echo ...setlocal with corresponding endlocal
1163 echo @echo off> test.cmd
1164 echo echo %%VAR%%>> test.cmd
1165 echo setlocal>> test.cmd
1166 echo set VAR=localval>> test.cmd
1167 echo echo %%VAR%%>> test.cmd
1168 echo endlocal>> test.cmd
1169 echo echo %%VAR%%>> test.cmd
1174 echo ...setlocal with no corresponding endlocal
1175 echo @echo off> test.cmd
1176 echo echo %%VAR%%>> test.cmd
1177 echo setlocal>> test.cmd
1178 echo set VAR=localval>> test.cmd
1179 echo echo %%VAR%%>> test.cmd
1184 cd .. & rd /q/s foobar
1186 echo -----------Testing Errorlevel-----------
1187 rem WARNING: Do *not* add tests using ErrorLevel after this section
1188 should_not_exist 2> nul > nul
1190 rem nt 4.0 doesn't really support a way of setting
errorlevel, so this is weak
1191 rem See http://www.robvanderwoude.com/exit.php
1194 if errorlevel 2 echo errorlevel too high
, bad
1195 if errorlevel 1 echo errorlevel just right
, good
1197 echo abc
%ErrorLevel%def
1198 if errorlevel 1 echo errorlevel nonzero
, bad
1199 if not errorlevel 1 echo errorlevel zero
, good
1200 rem Now verify that setting a real variable hides its magic variable
1202 echo %ErrorLevel% should be
7
1203 if errorlevel 7 echo setting var worked too well
, bad
1205 echo %ErrorLevel% should still be
7
1207 echo -----------Testing
GOTO-----------
1210 echo goto with no leading space worked
1213 echo goto with a leading space worked
1216 echo goto with a leading tab worked
1219 echo goto with a following space worked
1221 echo -----------Done
, jumping to EOF
-----------
1223 rem Subroutine to set errorlevel and return
1224 rem in windows nt 4.0, this always sets errorlevel 1, since /b isn't supported
1227 rem This line runs under cmd in windows NT 4, but not in more modern versions.