3035 lines
84 KiB
Batchfile
3035 lines
84 KiB
Batchfile
echo Tests for cmd's builtin commands
|
|
|
|
@echo on
|
|
echo ------------ Testing 'echo' [ON] ------------
|
|
echo word
|
|
echo 'singlequotedword'
|
|
echo "doublequotedword"
|
|
@echo at-echoed-word
|
|
echo "/?"
|
|
echo.
|
|
echo .
|
|
echo.word
|
|
echo .word
|
|
echo:
|
|
echo :
|
|
echo:word
|
|
echo :word
|
|
echo/
|
|
echo /
|
|
echo/word
|
|
echo /word
|
|
echo off now
|
|
echo word@space@
|
|
echo word@space@@space@
|
|
echo word
|
|
echo@tab@word
|
|
echo@tab@word @tab@
|
|
echo@tab@word@tab@@space@
|
|
@tab@echo word
|
|
echo @tab@word
|
|
echo @tab@word
|
|
echo@tab@@tab@word
|
|
echo @tab@ on @space@
|
|
@echo --- @ with chains and brackets
|
|
(echo the @ character chains until&&@echo we leave the current depth||(
|
|
echo hidden
|
|
@echo hidden
|
|
))&&echo and can hide brackets||(@echo command hidden)||@(echo brackets hidden)
|
|
@echo ---
|
|
|
|
@echo off
|
|
echo off@tab@@space@
|
|
@echo noecho1
|
|
@echo noecho2
|
|
@@@@@echo echo3
|
|
echo ------------ Testing 'echo' [OFF] ------------
|
|
echo word
|
|
echo 'singlequotedword'
|
|
echo "doublequotedword"
|
|
@echo at-echoed-word
|
|
echo "/?"
|
|
echo.
|
|
echo .
|
|
echo.word
|
|
echo .word
|
|
echo:
|
|
echo :
|
|
echo:word
|
|
echo :word
|
|
echo/
|
|
echo /
|
|
echo/word
|
|
echo /word
|
|
echo on again
|
|
echo word@space@
|
|
echo word@space@@space@
|
|
echo word
|
|
echo@tab@word
|
|
echo@tab@word @tab@
|
|
echo@tab@word@tab@@space@
|
|
@tab@echo word
|
|
echo @tab@word
|
|
echo @tab@word
|
|
echo@tab@@tab@word
|
|
|
|
echo ------------ Testing mixed echo modes ------------
|
|
echo @echo on> mixedEchoModes.cmd
|
|
echo if 1==1 echo foo>> mixedEchoModes.cmd
|
|
echo if 1==1 @echo bar>> mixedEchoModes.cmd
|
|
echo @echo off>> mixedEchoModes.cmd
|
|
echo if 1==1 echo foo2>> mixedEchoModes.cmd
|
|
echo if 1==1 @echo bar2>> mixedEchoModes.cmd
|
|
type mixedEchoModes.cmd
|
|
cmd /c mixedEchoModes.cmd
|
|
del mixedEchoModes.cmd
|
|
|
|
echo ------------ Testing parameterization ------------
|
|
call :TestParm a b c
|
|
call :TestParm "a b c"
|
|
call :TestParm "a b"\c
|
|
call :TestParm a=~`+,.{}!+b
|
|
call :TestParm a;b
|
|
call :TestParm "a;b"
|
|
call :TestParm a^;b
|
|
call :TestParm a[b]{c}(d)e
|
|
call :TestParm a&echo second line
|
|
call :TestParm a b,,,c
|
|
call :TestParm a==b;;c
|
|
call :TestParm a,,, b
|
|
goto :TestRem
|
|
|
|
:TestParm
|
|
echo '%1', '%2', '%3'
|
|
goto :eof
|
|
|
|
:TestRem
|
|
echo ------------ Testing rem ------------
|
|
rem Hello
|
|
rem Hello
|
|
rem Hello || foo
|
|
rem echo lol
|
|
rem echo foo & echo bar
|
|
rem @tab@ Hello
|
|
rem@tab@ Hello
|
|
rem@tab@echo foo & echo bar
|
|
@echo on
|
|
rem Hello
|
|
rem Hello
|
|
rem Hello || foo
|
|
rem echo lol
|
|
rem echo foo & echo bar
|
|
rem @tab@ Hello
|
|
rem@tab@ Hello
|
|
rem@tab@echo foo & echo bar
|
|
@echo off
|
|
|
|
echo ------------ Testing redirection operators ------------
|
|
mkdir foobar & cd foobar
|
|
echo --- stdout redirection
|
|
echo foo>foo
|
|
type foo
|
|
echo foo 1> foo
|
|
type foo
|
|
echo foo@tab@1> foo
|
|
type foo
|
|
echo foo 1>@tab@foo
|
|
type foo
|
|
echo foo@tab@1>@tab@foo
|
|
type foo
|
|
echo foo7 7> foo
|
|
type foo
|
|
echo foo9 9> foo
|
|
type foo
|
|
echo foo1> foo
|
|
type foo
|
|
echo foo11> foo
|
|
type foo
|
|
echo foo12> foo
|
|
type foo
|
|
echo foo13>"foo"
|
|
type foo
|
|
echo foo14>."\foo"
|
|
type foo
|
|
echo foo15>."\f"oo
|
|
type foo
|
|
del foo
|
|
echo1>foo
|
|
type foo
|
|
echo --- stdout appending
|
|
echo foo>foo
|
|
echo foo >>foo
|
|
type foo
|
|
del foo
|
|
echo foob >> foo
|
|
type foo
|
|
echo fooc 1>>foo
|
|
type foo
|
|
echo food1>>foo
|
|
type foo
|
|
echo food2>>"foo"
|
|
type foo
|
|
del foo
|
|
echo food21>>foo
|
|
type foo
|
|
del foo
|
|
echo foo> foo
|
|
echo foo7 7>> foo || (echo not supported & del foo)
|
|
if exist foo (type foo) else echo not supported
|
|
echo --- redirections within IF statements
|
|
if 1==1 echo foo1>bar
|
|
type bar & del bar
|
|
echo -----
|
|
if 1==1 (echo foo2>bar) else echo baz2>bar
|
|
type bar & del bar
|
|
if 1==1 (echo foo3) else echo baz3>bar
|
|
type bar || echo file does not exist, ok
|
|
if 1==1 (echo foo4>bar) else echo baz4>bar
|
|
type bar & del bar
|
|
if 1==0 (echo foo5>bar) else echo baz5>bar
|
|
type bar & del bar
|
|
if 1==0 (echo foo6) else echo baz6 1>bar
|
|
type bar & del bar
|
|
if 1==0 (echo foo7 1>bar) else echo baz7>bar
|
|
type bar & del bar
|
|
if 1==0 (echo foo8 1>bar) else echo baz8>bak
|
|
type bak
|
|
if 1==1 (echo foo>bar & echo baz)
|
|
type bar
|
|
if 1==1 (
|
|
echo foo>bar
|
|
echo baz
|
|
)
|
|
type bar
|
|
(if 1==1 (echo A) else echo B) > C
|
|
type C
|
|
(if 1==0 (echo A) else echo B) > C
|
|
type C
|
|
(if 1==0 (echo A > B) else echo C)
|
|
cd .. & rd /s/q foobar
|
|
|
|
echo ------------ Testing circumflex escape character ------------
|
|
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
|
|
echo ^hell^o, world
|
|
echo hell^o, world
|
|
echo hell^^o, world
|
|
echo hell^^^o, world
|
|
echo hello^
|
|
world
|
|
echo hello^
|
|
|
|
world
|
|
echo hello^
|
|
|
|
|
|
echo finished
|
|
mkdir foobar
|
|
echo baz> foobar\baz
|
|
type foobar\baz
|
|
type foobar^\baz
|
|
rd /s/q foobar
|
|
echo foo ^| echo bar
|
|
echo foo ^& echo bar
|
|
call :setError 0
|
|
echo bak ^&& echo baz 2> nul
|
|
echo %ErrorLevel%
|
|
echo foo ^> foo
|
|
echo ^<> foo
|
|
type foo
|
|
del foo
|
|
set WINE_FOO=oof
|
|
echo ff^%WINE_FOO%
|
|
set WINE_FOO=bar ^| baz
|
|
set WINE_FOO
|
|
rem FIXME: echoing %WINE_FOO% gives an error (baz not recognized) but prematurely
|
|
rem exits the script on windows; redirecting stdout and/or stderr doesn't help
|
|
echo %ErrorLevel%
|
|
call :setError 0
|
|
set WINE_FOO=bar ^^^| baz
|
|
set WINE_FOO
|
|
echo %WINE_FOO%
|
|
echo %ErrorLevel%
|
|
set WINE_FOO=
|
|
|
|
echo ------------ Testing chains ------------
|
|
rem The chain operators have the following bottom-up precedence:
|
|
rem 'else' precedes nothing and matches the closest unmatched 'if' in the same bracket depth
|
|
rem '&' precedes 'else'
|
|
rem '||' precedes '&' and 'else'
|
|
rem '&&' precedes '||', '&' and 'else'
|
|
rem '|' precedes '&&', '||', '&' and 'else'
|
|
rem
|
|
rem Example: 'if 1==1 if 2==2 if 3==3 a | b && c || d & e else f else g' is interpreted as
|
|
rem 'if 1==1 (if 2==2 (if 3==3 ((((a | b) && c) || d) & e) else f) else g)'
|
|
goto :cfailend
|
|
:cfail
|
|
echo %1
|
|
call :setError 1
|
|
goto :eof
|
|
:cfailend
|
|
echo --- chain success
|
|
echo a1&echo a2
|
|
echo b1&&echo b2
|
|
echo c1||echo c2
|
|
echo ---
|
|
echo d1&echo d2&echo d3
|
|
echo e1&echo e2&&echo e3
|
|
echo f1&echo f2||echo f3
|
|
echo ---
|
|
echo g1&&echo g2&echo g3
|
|
echo h1&&echo h2&&echo h3
|
|
echo i1&&echo i2||echo i3
|
|
echo ---
|
|
echo j1||echo j2&echo j3
|
|
echo ---
|
|
echo k1||echo k2&&echo k3
|
|
echo ---
|
|
echo l1||echo l2||echo l3
|
|
echo ---
|
|
echo --- chain failure
|
|
call :cfail a1&call :cfail a2
|
|
call :cfail b1&&call :cfail b2
|
|
echo ---
|
|
call :cfail c1||call :cfail c2
|
|
call :cfail d1&call :cfail d2&call :cfail d3
|
|
call :cfail e1&call :cfail e2&&call :cfail e3
|
|
echo ---
|
|
call :cfail f1&call :cfail f2||call :cfail f3
|
|
call :cfail g1&&call :cfail g2&call :cfail g3
|
|
echo ---
|
|
call :cfail h1&&call :cfail h2&&call :cfail h3
|
|
echo ---
|
|
call :cfail i1&&call :cfail i2||call :cfail i3
|
|
echo ---
|
|
call :cfail j1||call :cfail j2&call :cfail j3
|
|
call :cfail k1||call :cfail k2&&call :cfail k3
|
|
echo ---
|
|
call :cfail l1||call :cfail l2||call :cfail l3
|
|
echo --- chain brackets
|
|
rem Brackets are like regular commands, they support redirections
|
|
rem and have the same precedence as regular commands.
|
|
echo a1&(echo a2&echo a3)
|
|
echo b1&(echo b2&&echo b3)
|
|
echo c1&(echo c2||echo c3)
|
|
echo ---
|
|
echo d1&&(echo d2&echo d3)
|
|
echo e1&&(echo e2&&echo e3)
|
|
echo f1&&(echo f2||echo f3)
|
|
echo ---
|
|
echo g1||(echo g2&echo g3)
|
|
echo ---
|
|
echo h1||(echo h2&&echo h3)
|
|
echo ---
|
|
echo i1||(echo i2||echo i3)
|
|
echo ---
|
|
call :cfail j1&(call :cfail j2&call :cfail j3)
|
|
call :cfail k1&(call :cfail k2&&call :cfail k3)
|
|
echo ---
|
|
call :cfail l1&(call :cfail l2||call :cfail l3)
|
|
call :cfail m1&&(call :cfail m2&call :cfail m3)
|
|
echo ---
|
|
call :cfail n1&&(call :cfail n2&&call :cfail n3)
|
|
echo ---
|
|
call :cfail o1&&(call :cfail o2||call :cfail o3)
|
|
echo ---
|
|
call :cfail p1||(call :cfail p2&call :cfail p3)
|
|
call :cfail q1||(call :cfail q2&&call :cfail q3)
|
|
echo ---
|
|
call :cfail r1||(call :cfail r2||call :cfail r3)
|
|
echo --- chain pipe
|
|
rem Piped commands run at the same time, so the print order varies.
|
|
rem Additionally, they don't run in the batch script context, as shown by
|
|
rem 'call :existing_label|echo read the error message'.
|
|
(echo a 1>&2|echo a 1>&2) 2>&1
|
|
echo ---
|
|
echo b1|echo b2
|
|
echo c1&&echo c2|echo c3
|
|
echo d1||echo d2|echo d3
|
|
echo ---
|
|
echo e1&echo e2|echo e3
|
|
echo f1|echo f2&&echo f3
|
|
echo g1|echo g2||echo g3
|
|
echo ---
|
|
echo h1|echo h2&echo h3
|
|
echo i1|echo i2|echo i3
|
|
echo --- chain pipe input
|
|
rem The output data of the left side of a pipe can disappear, probably
|
|
rem because it finished too fast and closed the pipe before it could be read,
|
|
rem which means we can get broken results for the tests of this section.
|
|
echo @echo off> tmp.cmd
|
|
echo set IN=X>> tmp.cmd
|
|
echo set /p IN=%%1:>> tmp.cmd
|
|
echo setlocal EnableDelayedExpansion>> tmp.cmd
|
|
echo echo [!IN!,%%1]>> tmp.cmd
|
|
echo endlocal>> tmp.cmd
|
|
echo set IN=>> tmp.cmd
|
|
echo a1|cmd /ctmp.cmd a2
|
|
echo b1|cmd /ctmp.cmd b2|cmd /ctmp.cmd b3
|
|
echo c1|cmd /ctmp.cmd c2|cmd /ctmp.cmd c3|cmd /ctmp.cmd c4
|
|
echo d1|call tmp.cmd d2
|
|
echo e1|call tmp.cmd e2|call tmp.cmd e3
|
|
echo f1|call tmp.cmd f2|call tmp.cmd f3|call tmp.cmd f4
|
|
rem FIXME these 3 tests cause "unexpected end of output"
|
|
rem test : echo g1|tmp.cmd g2
|
|
rem result: g2:[g1,g2]
|
|
rem test : echo h1|tmp.cmd h2|tmp.cmd h3
|
|
rem result: h3:[h2:[h1,h2],h3]@or_broken@h3:[h2:,h3]
|
|
rem test : echo i1|tmp.cmd i2|tmp.cmd i3|tmp.cmd i4
|
|
rem result: i4:[i3:[i2:[i1,i2],i3],i4]@or_broken@i4:[i3:[i2:,i3],i4]@or_broken@i4:[i3:,i4]
|
|
del tmp.cmd
|
|
echo --- chain else
|
|
rem Command arguments are gready and eat up the 'else' unless terminated by
|
|
rem brackets, which means the 'else' can only be recognized when the
|
|
rem 'if true' command chain ends with brackets.
|
|
if 1==1 if 2==2 if 3==3 (echo a1) else (echo a2) else echo a3
|
|
if 1==1 if 2==2 if 3==0 (echo b1) else (echo b2) else echo b3
|
|
echo ---
|
|
if 1==1 if 2==0 if 3==3 (echo c1) else (echo c2) else echo c3
|
|
echo ---
|
|
if 1==1 if 2==0 if 3==0 (echo d1) else (echo d2) else echo d3
|
|
echo ---
|
|
if 1==0 if 2==2 if 3==3 (echo e1) else (echo e2) else echo e3
|
|
echo ---
|
|
if 1==0 if 2==2 if 3==0 (echo f1) else (echo f2) else echo f3
|
|
echo ---
|
|
if 1==0 if 2==0 if 3==3 (echo g1) else (echo g2) else echo g3
|
|
echo ---
|
|
if 1==0 if 2==0 if 3==0 (echo h1) else (echo h2) else echo h3
|
|
echo ---
|
|
echo --- chain else (if true)
|
|
if 1==1 echo a1 else echo a2
|
|
if 1==1 echo b1|echo b2 else echo b3
|
|
if 1==1 echo c1&&echo c2 else echo c3
|
|
if 1==1 echo d1||echo d2 else echo d3
|
|
echo ---
|
|
if 1==1 echo e1&echo e2 else echo e3
|
|
if 1==1 echo f1 else echo f2|echo f3
|
|
if 1==1 echo g1 else echo g2&&echo g3
|
|
if 1==1 echo h1 else echo h2||echo h3
|
|
echo ---
|
|
if 1==1 echo i1 else echo i2&echo i3
|
|
if 1==1 echo j1|(echo j2) else echo j3
|
|
echo ---
|
|
if 1==1 echo k1&&(echo k2) else echo k3
|
|
if 1==1 echo l1||(echo l2) else echo l3
|
|
echo ---
|
|
if 1==1 echo m1&(echo m2) else echo m3
|
|
if 1==1 (echo n1) else echo n2|echo n3
|
|
if 1==1 (echo o1) else echo o2&&echo o3
|
|
if 1==1 (echo p1) else echo p2||echo p3
|
|
if 1==1 (echo q1) else echo q2&echo q3
|
|
echo --- chain else (if false)
|
|
if 1==0 echo a1 else echo a2
|
|
if 1==0 echo b1|echo b2 else echo b3
|
|
if 1==0 echo c1&&echo c2 else echo c3
|
|
if 1==0 echo d1||echo d2 else echo d3
|
|
if 1==0 echo e1&echo e2 else echo e3
|
|
if 1==0 echo f1 else echo f2|echo f3
|
|
if 1==0 echo g1 else echo g2&&echo g3
|
|
if 1==0 echo h1 else echo h2||echo h3
|
|
if 1==0 echo i1 else echo i2&echo i3
|
|
if 1==0 echo j1|(echo j2) else echo j3
|
|
echo ---
|
|
if 1==0 echo k1&&(echo k2) else echo k3
|
|
if 1==0 echo l1||(echo l2) else echo l3
|
|
if 1==0 echo m1&(echo m2) else echo m3
|
|
if 1==0 (echo n1) else echo n2|echo n3
|
|
if 1==0 (echo o1) else echo o2&&echo o3
|
|
if 1==0 (echo p1) else echo p2||echo p3
|
|
echo ---
|
|
if 1==0 (echo q1) else echo q2&echo q3
|
|
echo ------------ Testing 'set' ------------
|
|
call :setError 0
|
|
rem Remove any WINE_FOO* WINE_BA* environment variables from shell before proceeding
|
|
for /f "delims==" %%i in ('set WINE_ba') do set %%i=
|
|
for /f "delims==" %%i in ('set WINE_foo') do set %%i=
|
|
set WINE_FOOBAR 2> nul > nul
|
|
echo %ErrorLevel%
|
|
set WINE_FOOBAR = baz
|
|
echo %ErrorLevel%
|
|
echo %WINE_FOOBAR%WINE_FOOBAR not defined
|
|
echo %WINE_FOOBAR %
|
|
set WINE_FOOBAR 2> nul
|
|
set WINE_FOOBAR = baz2
|
|
echo %ErrorLevel%
|
|
echo %WINE_fOObAr %
|
|
set WINE_FOOBAR= bar
|
|
echo %ErrorLevel%
|
|
echo %WINE_FOOBAR%
|
|
set WINE_FOO
|
|
set WINE_FOOBAR=
|
|
set WINE_FOOB
|
|
echo %WINE_FOOBAR%WINE_FOOBAR not defined
|
|
set WINE_FOOBAR =
|
|
set WINE_FOOBA 2> nul > nul
|
|
echo %ErrorLevel%
|
|
set WINE_FOO=bar
|
|
echo %WINE_FOO%
|
|
set WINE_FOO=foo
|
|
set WINE_BAR=bar
|
|
echo %WINE_FOO%%WINE_BAR%
|
|
set WINE_BAR=
|
|
set WINE_FOO=
|
|
set WINE_FOO=%WINE_FOO%
|
|
echo %WINE_FOO%WINE_FOO not defined
|
|
set WINE_BAZ%=bazbaz
|
|
set WINE_BA
|
|
echo %WINE_BAZ%%
|
|
set WINE_BAZ%=
|
|
echo set "WINE_FOO=bar" should not include the quotes in the variable value
|
|
set "WINE_FOO=bar"
|
|
echo %WINE_FOO%
|
|
set@tab@WINE_FOO=foo
|
|
echo %WINE_FOO%
|
|
set@tab@WINE_FOO=
|
|
echo '%WINE_FOO%'
|
|
set WINE_FOO=foo@space@
|
|
echo '%WINE_FOO%'
|
|
set WINE_FOO=foo@tab@
|
|
echo '%WINE_FOO%'
|
|
rem Space symbol must appear in `var`
|
|
set WINE_FOO=value@space@
|
|
echo '%WINE_FOO%'
|
|
rem Space symbol must NOT appear in `var`
|
|
set "WINE_FOO=value"@space@
|
|
echo '%WINE_FOO%'
|
|
rem Mixed examples:
|
|
set WINE_FOO=jim fred
|
|
echo '%WINE_FOO%'
|
|
set WINE_FOO="jim" fred
|
|
echo '%WINE_FOO%'
|
|
set "WINE_FOO=jim fred"
|
|
echo '%WINE_FOO%'
|
|
set "WINE_FOO=jim" fred
|
|
echo '%WINE_FOO%'
|
|
rem Only the final quote ends the string
|
|
set "WINE_FOO=apple"banana"grape"orange
|
|
echo '%WINE_FOO%'
|
|
set WINE_FOO=
|
|
|
|
echo ------------ Testing variable expansion ------------
|
|
call :setError 0
|
|
echo ~p0 should be path containing batch file
|
|
echo %~p0
|
|
mkdir dummydir
|
|
cd dummydir
|
|
echo %~p0
|
|
cd ..
|
|
rmdir dummydir
|
|
echo ~dp0 should be directory containing batch file
|
|
echo %~dp0
|
|
mkdir dummydir
|
|
cd dummydir
|
|
echo %~dp0
|
|
cd ..
|
|
rmdir dummydir
|
|
echo CD value %CD%
|
|
echo %%
|
|
echo P%
|
|
echo %P
|
|
echo %WINE_UNKNOWN%S
|
|
echo P%WINE_UNKNOWN%
|
|
echo P%WINE_UNKNOWN%S
|
|
echo %ERRORLEVEL
|
|
echo %ERRORLEVEL%
|
|
echo %ERRORLEVEL%%ERRORLEVEL%
|
|
echo %ERRORLEVEL%ERRORLEVEL%
|
|
echo %ERRORLEVEL%%
|
|
echo %ERRORLEVEL%%%
|
|
echo P%ERRORLEVEL%
|
|
echo %ERRORLEVEL%S
|
|
echo P%ERRORLEVEL%S
|
|
|
|
echo ------------ Testing variable substrings ------------
|
|
set WINE_VAR=qwerty
|
|
echo %WINE_VAR:~0,1%
|
|
echo %WINE_VAR:~0,3%
|
|
echo %WINE_VAR:~2,2%
|
|
echo '%WINE_VAR:~-2,3%'
|
|
echo '%WINE_VAR:~-2,1%'
|
|
echo %WINE_VAR:~2,-1%
|
|
echo %WINE_VAR:~2,-3%
|
|
echo '%WINE_VAR:~-2,-4%'
|
|
echo %WINE_VAR:~-3,-2%
|
|
set WINE_VAR=
|
|
|
|
echo ------------ Testing variable substitution ------------
|
|
echo --- in FOR variables
|
|
for %%i in ("A B" C) do echo %%i
|
|
rem check works when prefix with @
|
|
@for %%i in ("A B" C) do echo %%i
|
|
rem quotes removal
|
|
for %%i in ("A B" C) do echo '%%~i'
|
|
rem fully qualified path
|
|
for %%f in ("C D" E) do echo %%~ff
|
|
rem drive letter
|
|
for %%i in ("F G" H) do echo %%~di
|
|
rem path
|
|
for %%d in ("I J" K) do echo %%~pd
|
|
rem filename
|
|
for %%i in ("L M" N) do echo %%~ni
|
|
rem file extension
|
|
for %%i in ("O. P.OOL" Q.TABC hello) do echo '%%~xi'
|
|
rem path with short path names
|
|
for %%I in ("R S" T ABCDEFGHIJK.LMNOP) do echo '%%~sI'
|
|
rem file attribute
|
|
for %%i in ("U V" W) do echo '%%~ai'
|
|
echo foo> foo
|
|
for %%i in (foo) do echo '%%~ai'
|
|
for %%i in (foo) do echo '%%~zi'
|
|
del foo
|
|
rem file date/time
|
|
rem Not fully testable, until we can grep dir's output to get foo's creation time in an envvar...
|
|
for %%i in ("a b" c) do echo '%%~ti'
|
|
rem file size
|
|
rem Similar issues as above
|
|
for %%i in ("a b" c) do echo '%%~zi'
|
|
rem combined options
|
|
for %%i in ("d e" f) do echo %%~dpi
|
|
for %%i in ("g h" i) do echo %%~sdi
|
|
for %%i in ("g h" i) do echo %%~dsi
|
|
for %%i in ("j k" l.eh) do echo '%%~xsi'
|
|
for %%i in ("") do echo '%%~i,%%~fi,%%~di,%%~pi,%%~ni,%%~xi,%%~si,%%~ai,%%~ti,%%~zi'
|
|
|
|
echo --- in parameters
|
|
for %%i in ("A B" C) do call :echoFun %%i
|
|
rem quotes removal
|
|
for %%i in ("A B" C) do call :echoFunQ %%i
|
|
rem fully qualified path
|
|
for %%f in ("C D" E) do call :echoFunF %%f
|
|
rem drive letter
|
|
for %%i in ("F G" H) do call :echoFunD %%i
|
|
rem path
|
|
for %%d in ("I J" K) do call :echoFunP %%d
|
|
rem filename
|
|
for %%i in ("L M" N) do call :echoFunN %%i
|
|
rem file extension
|
|
for %%i in ("O. P.OOL" Q.TABC hello) do call :echoFunX %%i
|
|
rem path with short path names
|
|
for %%I in ("R S" T ABCDEFGHIJK.LMNOP) do call :echoFunS %%I
|
|
rem NT4 aborts whole script execution when encountering ~a, ~t and ~z substitutions, preventing full testing
|
|
rem combined options
|
|
for %%i in ("d e" f) do call :echoFunDP %%i
|
|
for %%i in ("g h" i) do call :echoFunSD %%i
|
|
for %%i in ("g h" i) do call :echoFunDS %%i
|
|
for %%i in ("j k" l.eh) do call :echoFunXS %%i
|
|
|
|
goto :endEchoFuns
|
|
:echoFun
|
|
echo %1
|
|
goto :eof
|
|
|
|
:echoFunQ
|
|
echo '%~1'
|
|
goto :eof
|
|
|
|
:echoFunF
|
|
echo %~f1
|
|
goto :eof
|
|
|
|
:echoFunD
|
|
echo %~d1
|
|
goto :eof
|
|
|
|
:echoFunP
|
|
echo %~p1
|
|
goto :eof
|
|
|
|
:echoFunN
|
|
echo %~n1
|
|
goto :eof
|
|
|
|
:echoFunX
|
|
echo '%~x1'
|
|
goto :eof
|
|
|
|
:echoFunS
|
|
rem some NT4 workaround
|
|
set WINE_VAR='%~s1'
|
|
echo %WINE_VAR%
|
|
set WINE_VAR=
|
|
goto :eof
|
|
|
|
:echoFunDP
|
|
echo %~dp1
|
|
goto :eof
|
|
|
|
:echoFunSD
|
|
echo %~sd1
|
|
goto :eof
|
|
|
|
:echoFunDS
|
|
echo %~ds1
|
|
goto :eof
|
|
|
|
:echoFunXS
|
|
echo '%~xs1'
|
|
goto :eof
|
|
:endEchoFuns
|
|
|
|
echo ------------ Testing variable delayed expansion ------------
|
|
rem NT4 doesn't support this
|
|
echo --- default mode (load-time expansion)
|
|
set WINE_FOO=foo
|
|
echo %WINE_FOO%
|
|
echo !WINE_FOO!
|
|
if %WINE_FOO% == foo (
|
|
set WINE_FOO=bar
|
|
if %WINE_FOO% == bar (echo bar) else echo foo
|
|
)
|
|
|
|
set WINE_FOO=foo
|
|
if %WINE_FOO% == foo (
|
|
set WINE_FOO=bar
|
|
if !WINE_FOO! == bar (echo bar) else echo foo
|
|
)
|
|
|
|
echo --- runtime (delayed) expansion mode
|
|
setlocal EnableDelayedExpansion
|
|
set WINE_FOO=foo
|
|
echo %WINE_FOO%
|
|
echo !WINE_FOO!
|
|
if %WINE_FOO% == foo (
|
|
set WINE_FOO=bar
|
|
if %WINE_FOO% == bar (echo bar) else echo foo
|
|
)
|
|
|
|
set WINE_FOO=foo
|
|
if %WINE_FOO% == foo (
|
|
set WINE_FOO=bar
|
|
if !WINE_FOO! == bar (echo bar) else echo foo
|
|
)
|
|
echo %ErrorLevel%
|
|
setlocal DisableDelayedExpansion
|
|
echo %ErrorLevel%
|
|
set WINE_FOO=foo
|
|
echo %WINE_FOO%
|
|
echo !WINE_FOO!
|
|
set WINE_FOO=
|
|
echo --- using /V cmd flag
|
|
echo @echo off> tmp.cmd
|
|
echo set WINE_FOO=foo>> tmp.cmd
|
|
echo echo %%WINE_FOO%%>> tmp.cmd
|
|
echo echo !WINE_FOO!>> tmp.cmd
|
|
echo set WINE_FOO=>> tmp.cmd
|
|
cmd /V:ON /C tmp.cmd
|
|
cmd /V:OfF /C tmp.cmd
|
|
del tmp.cmd
|
|
|
|
echo ------------ Testing conditional execution ------------
|
|
echo --- unconditional ampersand
|
|
call :setError 123 & echo foo1
|
|
echo bar2 & echo foo2
|
|
mkdir foobar & cd foobar
|
|
echo > foobazbar
|
|
cd .. & rd /s/q foobar
|
|
if exist foobazbar (
|
|
echo foobar not deleted!
|
|
cd ..
|
|
rd /s/q foobar
|
|
) else echo foobar deleted
|
|
echo --- on success conditional and
|
|
call :setError 456 && echo foo3 > foo3
|
|
if exist foo3 (
|
|
echo foo3 created
|
|
del foo3
|
|
) else echo foo3 not created
|
|
echo bar4 && echo foo4
|
|
echo --- on failure conditional or
|
|
call :setError 789 || echo foo5
|
|
echo foo6 || echo bar6 > bar6
|
|
if exist bar6 (
|
|
echo bar6 created
|
|
del bar6
|
|
)
|
|
|
|
echo ------------ Testing cd ------------
|
|
mkdir foobar
|
|
cd foobar
|
|
echo blabla > singleFile
|
|
dir /b
|
|
echo Current dir: %CD%
|
|
cd
|
|
cd ..
|
|
cd
|
|
cd foobar@space@
|
|
cd
|
|
cd ..
|
|
cd
|
|
cd @space@foobar
|
|
cd
|
|
cd..
|
|
cd
|
|
cd foobar
|
|
cd..@space@
|
|
cd
|
|
if not exist foobar (cd ..)
|
|
cd foobar
|
|
cd@tab@..@tab@@space@@tab@
|
|
cd
|
|
if not exist foobar (cd ..)
|
|
cd foobar
|
|
mkdir "bar bak"
|
|
cd "bar bak"
|
|
cd
|
|
cd ..
|
|
cd ".\bar bak"
|
|
cd
|
|
cd ..
|
|
cd .\"bar bak"
|
|
cd
|
|
cd ..
|
|
cd bar bak
|
|
cd
|
|
cd "bar bak@space@"@tab@@space@
|
|
cd
|
|
cd ..\..
|
|
cd
|
|
rd /Q/s foobar
|
|
mkdir foobar
|
|
cd /d@tab@foobar
|
|
cd
|
|
cd ..
|
|
rd /q/s foobar
|
|
|
|
echo ------------ Testing type ------------
|
|
echo bar> foobaz
|
|
@echo on
|
|
type foobaz
|
|
echo ---
|
|
@echo off
|
|
type foobaz@tab@
|
|
echo ---1
|
|
type ."\foobaz"
|
|
echo ---2
|
|
type ".\foobaz"
|
|
echo ---3
|
|
del foobaz
|
|
|
|
echo ------------ Testing NUL ------------
|
|
md foobar & cd foobar
|
|
rem NUL file (non) creation + case insensitivity
|
|
rem Note: "if exist" does not work with NUL, so to check for file existence we use a kludgy workaround
|
|
echo > bar
|
|
echo foo > NUL
|
|
dir /b /a-d
|
|
echo foo > nul
|
|
dir /b /a-d
|
|
echo foo > NuL
|
|
@tab@dir /b@tab@/a-d
|
|
del bar
|
|
rem NUL not special everywhere
|
|
call :setError 123
|
|
echo NUL> foo
|
|
if not exist foo (echo foo should have been created) else (
|
|
type foo
|
|
del foo
|
|
)
|
|
rem Empty file creation
|
|
copy nul foo > nul
|
|
if exist foo (
|
|
echo foo created
|
|
del foo
|
|
type foo
|
|
) else (
|
|
echo ***
|
|
)
|
|
echo 1234 >a.a
|
|
copy a.a+NUL b.b >nul
|
|
call :CheckFileSize a.a 7 b.b 8
|
|
copy NUL+a.a b.b >nul
|
|
call :CheckFileSize a.a 7 b.b 8
|
|
mkdir subdir
|
|
copy a.a+NUL subdir\ >nul
|
|
call :CheckFileSize a.a 7 subdir\a.a 8
|
|
del subdir\a.a
|
|
cd subdir
|
|
copy ..\a.a NUL >nul
|
|
if exist a.a echo Failed
|
|
cd ..
|
|
rd subdir /s /q
|
|
del a.a b.b
|
|
cd .. & rd foobar /s /q
|
|
|
|
echo ------------ Testing if/else ------------
|
|
echo --- if/else should work with blocks
|
|
if 0 == 0 (
|
|
echo if seems to work
|
|
) else (
|
|
echo if seems to be broken
|
|
)
|
|
if 1 == 0 (
|
|
echo else seems to be broken
|
|
) else (
|
|
echo else seems to work
|
|
)
|
|
if /c==/c (
|
|
echo if seems not to detect /c as parameter
|
|
) else (
|
|
echo parameter detection seems to be broken
|
|
)
|
|
SET elseIF=0
|
|
if 1 == 1 (
|
|
SET /a elseIF=%elseIF%+1
|
|
) else if 1 == 1 (
|
|
SET /a elseIF=%elseIF%+2
|
|
) else (
|
|
SET /a elseIF=%elseIF%+2
|
|
)
|
|
if %elseIF% == 1 (
|
|
echo else if seems to work
|
|
) else (
|
|
echo else if seems to be broken
|
|
)
|
|
SET elseIF=0
|
|
if 1 == 2 (
|
|
SET /a elseIF=%elseIF%+2
|
|
) else if 1 == 1 (
|
|
SET /a elseIF=%elseIF%+1
|
|
) else (
|
|
SET /a elseIF=%elseIF%+2
|
|
)
|
|
if %elseIF% == 1 (
|
|
echo else if seems to work
|
|
) else (
|
|
echo else if seems to be broken
|
|
)
|
|
SET elseIF=0
|
|
if 1 == 2 (
|
|
SET /a elseIF=%elseIF%+2
|
|
) else if 1 == 2 (
|
|
SET /a elseIF=%elseIF%+2
|
|
) else (
|
|
SET /a elseIF=%elseIF%+1
|
|
)
|
|
if %elseIF% == 1 (
|
|
echo else if seems to work
|
|
) else (
|
|
echo else if seems to be broken
|
|
)
|
|
echo --- case sensitivity with and without /i option
|
|
if bar==BAR echo if does not default to case sensitivity
|
|
if not bar==BAR echo if seems to default to case sensitivity
|
|
if /i foo==FOO echo if /i seems to work
|
|
if /i not foo==FOO echo if /i seems to be broken
|
|
if /I foo==FOO echo if /I seems to work
|
|
if /I not foo==FOO echo if /I seems to be broken
|
|
|
|
echo --- string comparisons
|
|
if abc == abc (echo equal) else echo non equal
|
|
if abc =="abc" (echo equal) else echo non equal
|
|
if "abc"== abc (echo equal) else echo non equal
|
|
if "abc"== "abc" (echo equal) else echo non equal
|
|
|
|
echo --- tabs handling
|
|
if@tab@1==1 echo doom
|
|
if @tab@1==1 echo doom
|
|
if 1==1 (echo doom) else@tab@echo quake
|
|
if@tab@not @tab@1==@tab@0 @tab@echo lol
|
|
if 1==0@tab@(echo doom) else echo quake
|
|
if 1==0 (echo doom)@tab@else echo quake
|
|
if 1==0 (echo doom) else@tab@echo quake
|
|
|
|
echo --- comparison operators
|
|
rem NT4 misevaluates conditionals in for loops so we have to use subroutines as workarounds
|
|
echo ------ for strings
|
|
rem NT4 stops processing of the whole batch file as soon as it finds a
|
|
rem comparison operator non fully uppercased, such as lss instead of LSS, so we
|
|
rem can't test those here.
|
|
if LSS LSS LSSfoo (echo LSS string can be used as operand for LSS comparison)
|
|
if LSS LSS LSS (echo bar)
|
|
if 1.1 LSS 1.10 (echo floats are handled as strings)
|
|
if "9" LSS "10" (echo numbers in quotes recognized!) else echo numbers in quotes are handled as strings
|
|
if not "-1" LSS "1" (echo negative numbers as well) else echo NT4
|
|
if /i foo LSS FoOc echo if /i seems to work for LSS
|
|
if /I not foo LSS FOOb echo if /I seems to be broken for LSS
|
|
set WINE_STR_PARMS=A B AB BA AA
|
|
for %%i in (%WINE_STR_PARMS%) do (
|
|
for %%j in (%WINE_STR_PARMS%) do (
|
|
call :LSStest %%i %%j))
|
|
if b LSS B (echo b LSS B) else echo NT4
|
|
if /I b LSS B echo b LSS B insensitive
|
|
if b LSS A echo b LSS A
|
|
if /I b LSS A echo b LSS A insensitive
|
|
if a LSS B (echo a LSS B) else echo NT4
|
|
if /I a LSS B echo a LSS B insensitive
|
|
if A LSS b echo A LSS b
|
|
if /I A LSS b echo A LSS b insensitive
|
|
for %%i in (%WINE_STR_PARMS%) do (
|
|
for %%j in (%WINE_STR_PARMS%) do (
|
|
call :LEQtest %%i %%j))
|
|
if b LEQ B (echo b LEQ B) else echo NT4
|
|
if /I b LEQ B echo b LEQ B insensitive
|
|
if b LEQ A echo b LEQ A
|
|
if /I b LEQ A echo b LEQ A insensitive
|
|
if a LEQ B (echo a LEQ B) else echo NT4
|
|
if /I a LEQ B echo a LEQ B insensitive
|
|
if A LEQ b echo A LEQ b
|
|
if /I A LEQ b echo A LEQ b insensitive
|
|
for %%i in (%WINE_STR_PARMS%) do (
|
|
for %%j in (%WINE_STR_PARMS%) do (
|
|
call :EQUtest %%i %%j))
|
|
if /I A EQU a echo A EQU a insensitive
|
|
for %%i in (%WINE_STR_PARMS%) do (
|
|
for %%j in (%WINE_STR_PARMS%) do (
|
|
call :NEQtest %%i %%j))
|
|
for %%i in (%WINE_STR_PARMS%) do (
|
|
for %%j in (%WINE_STR_PARMS%) do (
|
|
call :GEQtest %%i %%j))
|
|
for %%i in (%WINE_STR_PARMS%) do (
|
|
for %%j in (%WINE_STR_PARMS%) do (
|
|
call :GTRtest %%i %%j))
|
|
echo ------ for numbers
|
|
if -1 LSS 1 (echo negative numbers handled)
|
|
if not -1 LSS -10 (echo negative numbers handled)
|
|
if not 9 LSS 010 (echo octal handled)
|
|
if not -010 LSS -8 (echo also in negative form)
|
|
if 4 LSS 0x5 (echo hexa handled)
|
|
if not -1 LSS -0x1A (echo also in negative form)
|
|
if 11 LSS 101 (echo 11 LSS 101)
|
|
set WINE_INT_PARMS=0 1 10 9
|
|
for %%i in (%WINE_INT_PARMS%) do (
|
|
for %%j in (%WINE_INT_PARMS%) do (
|
|
call :LSStest %%i %%j))
|
|
for %%i in (%WINE_INT_PARMS%) do (
|
|
for %%j in (%WINE_INT_PARMS%) do (
|
|
call :LEQtest %%i %%j))
|
|
for %%i in (%WINE_INT_PARMS%) do (
|
|
for %%j in (%WINE_INT_PARMS%) do (
|
|
call :EQUtest %%i %%j))
|
|
if 011 EQU 9 (echo octal ok)
|
|
if 0xA1 EQU 161 (echo hexa ok)
|
|
if 0xA1 EQU "161" (echo hexa should be recognized) else (echo string/hexa compare ok)
|
|
if "0xA1" EQU 161 (echo hexa should be recognized) else (echo string/hexa compare ok)
|
|
for %%i in (%WINE_INT_PARMS%) do (
|
|
for %%j in (%WINE_INT_PARMS%) do (
|
|
call :NEQtest %%i %%j))
|
|
for %%i in (%WINE_INT_PARMS%) do (
|
|
for %%j in (%WINE_INT_PARMS%) do (
|
|
call :GEQtest %%i %%j))
|
|
for %%i in (%WINE_INT_PARMS%) do (
|
|
for %%j in (%WINE_INT_PARMS%) do (
|
|
call :GTRtest %%i %%j))
|
|
echo ------ for numbers and stringified numbers
|
|
if not "1" EQU 1 (echo strings and integers not equal) else echo foo
|
|
if not 1 EQU "1" (echo strings and integers not equal) else echo foo
|
|
if '1' EQU 1 echo '1' EQU 1
|
|
if 1 EQU '1' echo 1 EQU '1'
|
|
if not "1" GEQ 1 (echo foo) else echo bar
|
|
if "10" GEQ "1" echo "10" GEQ "1"
|
|
if '1' GEQ 1 (echo '1' GEQ 1) else echo NT4
|
|
if 1 GEQ "1" echo 1 GEQ "1"
|
|
if "1" GEQ "1" echo "1" GEQ "1"
|
|
if '1' GEQ "1" echo '1' GEQ "1"
|
|
if "10" GEQ "1" echo "10" GEQ "1"
|
|
if not 1 GEQ '1' (echo non NT4) else echo 1 GEQ '1'
|
|
for %%i in ("1" '1') do call :GEQtest %%i '1'
|
|
if "10" GEQ '1' (echo "10" GEQ '1') else echo foo
|
|
if 1 GEQ "10" (echo 1 GEQ "10") else echo foo
|
|
if "1" GEQ "10" (echo 1 GEQ "10") else echo foo
|
|
if '1' GEQ "10" (echo '1' GEQ "10") else echo foo
|
|
if "10" GEQ "10" (echo "10" GEQ "10")
|
|
echo --- unconditional ampersand after if one line
|
|
if "0"=="0" echo 1 & echo 2 & echo 3 else echo 4
|
|
echo ---
|
|
echo x & if "0"=="1" echo 1 & echo 2
|
|
echo ---
|
|
echo x & if "0"=="1" echo 1 & echo 2 & echo 3
|
|
echo ---
|
|
echo x & if "0"=="1" (echo 1 & echo 2 & echo 3)
|
|
echo ---
|
|
echo x & if "0"=="1" echo 1 & echo 2 & echo 3 else echo 4
|
|
echo ---
|
|
goto :endIfCompOpsSubroutines
|
|
|
|
rem IF subroutines helpers
|
|
:LSStest
|
|
if %1 LSS %2 echo %1 LSS %2
|
|
goto :eof
|
|
:LEQtest
|
|
if %1 LEQ %2 echo %1 LEQ %2
|
|
goto :eof
|
|
:EQUtest
|
|
if %1 EQU %2 echo %1 EQU %2
|
|
goto :eof
|
|
:NEQtest
|
|
if %1 NEQ %2 echo %1 NEQ %2
|
|
goto :eof
|
|
:GEQtest
|
|
if %1 GEQ %2 echo %1 GEQ %2
|
|
goto :eof
|
|
:GTRtest
|
|
if %1 GTR %2 echo %1 GTR %2
|
|
goto :eof
|
|
|
|
:endIfCompOpsSubroutines
|
|
set WINE_STR_PARMS=
|
|
set WINE_INT_PARMS=
|
|
|
|
echo ------------ Testing for ------------
|
|
echo --- plain FOR
|
|
for %%i in (A B C) do echo %%i
|
|
for %%i in (A B C) do echo %%I
|
|
for %%i in (A B C) do echo %%j
|
|
for %%i in (A B C) do call :forTestFun1 %%i
|
|
for %%i in (1,4,1) do echo %%i
|
|
for %%i in (A, B,C) do echo %%i
|
|
for %%i in (X) do echo %%i
|
|
for@tab@%%i in (X2) do echo %%i
|
|
for %%i in@tab@(X3) do echo %%i
|
|
for %%i in (@tab@ foo@tab@) do echo %%i
|
|
for@tab@ %%i in@tab@(@tab@M) do echo %%i
|
|
for %%i@tab@in (X)@tab@do@tab@echo %%i
|
|
for@tab@ %%j in@tab@(@tab@M, N, O@tab@) do echo %%j
|
|
for %%i in (`echo A B`) do echo %%i
|
|
for %%i in ('echo A B') do echo %%i
|
|
for %%i in ("echo A B") do echo %%i
|
|
for %%i in ("A B" C) do echo %%i
|
|
goto :endForTestFun1
|
|
:forTestFun1
|
|
echo %1
|
|
goto :eof
|
|
:endForTestFun1
|
|
echo --- imbricated FORs
|
|
for %%i in (X) do (
|
|
for %%j in (Y) do (
|
|
echo %%i %%j))
|
|
for %%i in (X) do (
|
|
for %%I in (Y) do (
|
|
echo %%i %%I))
|
|
for %%i in (A B) do (
|
|
for %%j in (C D) do (
|
|
echo %%i %%j))
|
|
for %%i in (A B) do (
|
|
for %%j in (C D) do (
|
|
call :forTestFun2 %%i %%j ))
|
|
goto :endForTestFun2
|
|
:forTestFun2
|
|
echo %1 %2
|
|
goto :eof
|
|
:endForTestFun2
|
|
mkdir foobar & cd foobar
|
|
mkdir foo
|
|
mkdir bar
|
|
mkdir baz
|
|
echo > bazbaz
|
|
echo --- basic wildcards
|
|
for %%i in (ba*) do echo %%i
|
|
echo --- for /d
|
|
for /d %%i in (baz foo bar) do echo %%i 2>&1
|
|
rem Confirm we don't match files:
|
|
for /d %%i in (bazb*) do echo %%i 2>&1
|
|
for /d %%i in (bazb2*) do echo %%i 2>&1
|
|
rem Show we pass through non wildcards
|
|
for /d %%i in (PASSED) do echo %%i
|
|
for /d %%i in (xxx) do (
|
|
echo %%i - Should be xxx
|
|
echo Expected second line
|
|
)
|
|
rem Show we issue no messages on failures
|
|
for /d %%i in (FAILED?) do echo %%i 2>&1
|
|
for /d %%i in (FAILED?) do (
|
|
echo %%i - Unexpected!
|
|
echo FAILED Unexpected second line
|
|
)
|
|
for /d %%i in (FAILED*) do echo %%i 2>&1
|
|
for /d %%i in (FAILED*) do (
|
|
echo %%i - Unexpected!
|
|
echo FAILED Unexpected second line
|
|
)
|
|
rem FIXME can't test wildcard expansion here since it's listed in directory
|
|
rem order, and not in alphabetic order.
|
|
rem Proper testing would need a currently missing "sort" program implementation.
|
|
rem for /d %%i in (ba*) do echo %%i>> tmp
|
|
rem sort < tmp
|
|
rem del tmp
|
|
rem for /d %%i in (?a*) do echo %%i>> tmp
|
|
rem sort < tmp
|
|
rem del tmp
|
|
rem for /d %%i in (*) do echo %%i>> tmp
|
|
rem sort < tmp
|
|
rem del tmp
|
|
echo > baz\bazbaz
|
|
goto :TestForR
|
|
|
|
:SetExpected
|
|
del temp.bat 2>nul
|
|
call :WriteLine set WINE_found=N
|
|
for /l %%i in (1,1,%WINE_expectedresults%) do (
|
|
call :WriteLine if "%%%%WINE_expectedresults.%%i%%%%"=="%%%%~1" set WINE_found=Y
|
|
call :WriteLine if "%%%%WINE_found%%%%"=="Y" set WINE_expectedresults.%%i=
|
|
call :WriteLine if "%%%%WINE_found%%%%"=="Y" goto :eof
|
|
)
|
|
call :WriteLine echo Got unexpected result: "%%%%~1"
|
|
goto :eof
|
|
|
|
:WriteLine
|
|
echo %*>> temp.bat
|
|
goto :EOF
|
|
|
|
:ValidateExpected
|
|
del temp.bat 2>nul
|
|
for /l %%i in (1,1,%WINE_expectedresults%) do (
|
|
call :WriteLine if not "%%%%WINE_expectedresults.%%i%%%%"=="" echo Found missing result: "%%%%WINE_expectedresults.%%i%%%%"
|
|
)
|
|
call temp.bat
|
|
del temp.bat 2>nul
|
|
goto :eof
|
|
|
|
:TestForR
|
|
rem %CD% does not work on NT4 so use the following workaround
|
|
for /d %%i in (.) do set WINE_CURDIR=%%~dpnxi
|
|
|
|
echo --- for /R
|
|
echo Plain directory enumeration
|
|
set WINE_expectedresults=4
|
|
set WINE_expectedresults.1=%WINE_CURDIR%\.
|
|
set WINE_expectedresults.2=%WINE_CURDIR%\bar\.
|
|
set WINE_expectedresults.3=%WINE_CURDIR%\baz\.
|
|
set WINE_expectedresults.4=%WINE_CURDIR%\foo\.
|
|
call :SetExpected
|
|
for /R %%i in (.) do call temp.bat "%%i"
|
|
call :ValidateExpected
|
|
|
|
echo Plain directory enumeration from provided root
|
|
set WINE_expectedresults=4
|
|
set WINE_expectedresults.1=%WINE_CURDIR%\.
|
|
set WINE_expectedresults.2=%WINE_CURDIR%\bar\.
|
|
set WINE_expectedresults.3=%WINE_CURDIR%\baz\.
|
|
set WINE_expectedresults.4=%WINE_CURDIR%\foo\.
|
|
if "%CD%"=="" goto :SkipBrokenNT4
|
|
call :SetExpected
|
|
for /R "%WINE_CURDIR%" %%i in (.) do call temp.bat "%%i"
|
|
call :ValidateExpected
|
|
:SkipBrokenNT4
|
|
|
|
echo File enumeration
|
|
set WINE_expectedresults=2
|
|
set WINE_expectedresults.1=%WINE_CURDIR%\baz\bazbaz
|
|
set WINE_expectedresults.2=%WINE_CURDIR%\bazbaz
|
|
call :SetExpected
|
|
for /R %%i in (baz*) do call temp.bat "%%i"
|
|
call :ValidateExpected
|
|
|
|
echo File enumeration from provided root
|
|
set WINE_expectedresults=2
|
|
set WINE_expectedresults.1=%WINE_CURDIR%\baz\bazbaz
|
|
set WINE_expectedresults.2=%WINE_CURDIR%\bazbaz
|
|
call :SetExpected
|
|
for /R %%i in (baz*) do call temp.bat "%%i"
|
|
call :ValidateExpected
|
|
|
|
echo Mixed enumeration
|
|
set WINE_expectedresults=6
|
|
set WINE_expectedresults.1=%WINE_CURDIR%\.
|
|
set WINE_expectedresults.2=%WINE_CURDIR%\bar\.
|
|
set WINE_expectedresults.3=%WINE_CURDIR%\baz\.
|
|
set WINE_expectedresults.4=%WINE_CURDIR%\baz\bazbaz
|
|
set WINE_expectedresults.5=%WINE_CURDIR%\bazbaz
|
|
set WINE_expectedresults.6=%WINE_CURDIR%\foo\.
|
|
call :SetExpected
|
|
for /R %%i in (. baz*) do call temp.bat "%%i"
|
|
call :ValidateExpected
|
|
|
|
echo Mixed enumeration from provided root
|
|
set WINE_expectedresults=6
|
|
set WINE_expectedresults.1=%WINE_CURDIR%\.
|
|
set WINE_expectedresults.2=%WINE_CURDIR%\bar\.
|
|
set WINE_expectedresults.3=%WINE_CURDIR%\baz\.
|
|
set WINE_expectedresults.4=%WINE_CURDIR%\baz\bazbaz
|
|
set WINE_expectedresults.5=%WINE_CURDIR%\bazbaz
|
|
set WINE_expectedresults.6=%WINE_CURDIR%\foo\.
|
|
call :SetExpected
|
|
for /R %%i in (. baz*) do call temp.bat "%%i"
|
|
call :ValidateExpected
|
|
|
|
echo With duplicates enumeration
|
|
set WINE_expectedresults=12
|
|
set WINE_expectedresults.1=%WINE_CURDIR%\bar\bazbaz
|
|
set WINE_expectedresults.2=%WINE_CURDIR%\bar\fred
|
|
set WINE_expectedresults.3=%WINE_CURDIR%\baz\bazbaz
|
|
set WINE_expectedresults.4=%WINE_CURDIR%\baz\bazbaz
|
|
set WINE_expectedresults.5=%WINE_CURDIR%\baz\bazbaz
|
|
set WINE_expectedresults.6=%WINE_CURDIR%\baz\fred
|
|
set WINE_expectedresults.7=%WINE_CURDIR%\bazbaz
|
|
set WINE_expectedresults.8=%WINE_CURDIR%\bazbaz
|
|
set WINE_expectedresults.9=%WINE_CURDIR%\bazbaz
|
|
set WINE_expectedresults.10=%WINE_CURDIR%\foo\bazbaz
|
|
set WINE_expectedresults.11=%WINE_CURDIR%\foo\fred
|
|
set WINE_expectedresults.12=%WINE_CURDIR%\fred
|
|
call :SetExpected
|
|
for /R %%i in (baz* bazbaz fred ba*) do call temp.bat "%%i"
|
|
call :ValidateExpected
|
|
|
|
echo Strip missing wildcards, keep unwildcarded names
|
|
set WINE_expectedresults=6
|
|
set WINE_expectedresults.1=%WINE_CURDIR%\bar\jim
|
|
set WINE_expectedresults.2=%WINE_CURDIR%\baz\bazbaz
|
|
set WINE_expectedresults.3=%WINE_CURDIR%\baz\jim
|
|
set WINE_expectedresults.4=%WINE_CURDIR%\bazbaz
|
|
set WINE_expectedresults.5=%WINE_CURDIR%\foo\jim
|
|
set WINE_expectedresults.6=%WINE_CURDIR%\jim
|
|
call :SetExpected
|
|
for /R %%i in (baz* fred* jim) do call temp.bat "%%i"
|
|
call :ValidateExpected
|
|
|
|
echo for /R passed
|
|
echo --- Complex wildcards unix and windows slash
|
|
cd ..
|
|
echo Windows slashes, valid path
|
|
for %%f in (foobar\baz\bazbaz) do echo ASIS: %%f
|
|
for %%f in (foobar\baz\*) do echo WC : %%f
|
|
echo Windows slashes, invalid path
|
|
for %%f in (foobar\jim\bazbaz) do echo ASIS: %%f
|
|
for %%f in (foobar\jim\*) do echo WC : %%f
|
|
echo Unix slashes, valid path
|
|
for %%f in (foobar/baz/bazbaz) do echo ASIS: %%f
|
|
for %%f in (foobar/baz/*) do echo WC : %%f
|
|
echo Unix slashes, invalid path
|
|
for %%f in (foobar/jim/bazbaz) do echo ASIS: %%f
|
|
for %%f in (foobar/jim/*) do echo WC : %%f
|
|
echo Done
|
|
rd /s/Q foobar
|
|
echo --- for /L
|
|
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
|
|
for /L %%i in (1,2,0) do echo %%i
|
|
for@tab@/L %%i in (1,2,0) do echo %%i
|
|
for /L %%i in (1,2,6) do echo %%i
|
|
for /l %%i in (1 ,2,6) do echo %%i
|
|
for /L %%i in (a,2,3) do echo %%i
|
|
for /L %%i in (1,2,-1) do echo %%i
|
|
for /L %%i in (-4,-1,-1) do echo %%i
|
|
for /L %%i in (1,-2,-2) do echo %%i
|
|
for /L %%i in (1,2,a) do echo %%i
|
|
echo ErrorLevel %ErrorLevel%
|
|
for /L %%i in (1,a,b) do echo %%i
|
|
echo ErrorLevel %ErrorLevel%
|
|
rem Test boundaries
|
|
for /l %%i in (1,1,4) do echo %%i
|
|
for /l %%i in (1,2,4) do echo %%i
|
|
for /l %%i in (4,-1,1) do echo %%i
|
|
for /l %%i in (4,-2,1) do echo %%i
|
|
for /l %%i in (1,-1,4) do echo %%i
|
|
for /l %%i in (4,1,1) do echo %%i
|
|
for /L %%i in (a,2,b) do echo %%i
|
|
for /L %%i in (1,1,1) do echo %%i
|
|
for /L %%i in (1,-2,-1) do echo %%i
|
|
for /L %%i in (-1,-1,-1) do echo %%i
|
|
for /L %%i in (1,2, 3) do echo %%i
|
|
rem Test zero iteration skips the body of the for
|
|
for /L %%i in (2,2,1) do (
|
|
echo %%i
|
|
echo FAILED
|
|
)
|
|
echo --- set /a
|
|
goto :testseta
|
|
|
|
Rem Ideally for /f can be used rather than building a command to execute
|
|
rem but that does not work on NT4
|
|
:checkenvvars
|
|
if "%1"=="" goto :eof
|
|
call :executecmd set wine_result=%%%1%%
|
|
if "%wine_result%"=="%2" (
|
|
echo %1 correctly %2
|
|
) else echo ERROR: %1 incorrectly %wine_result% [%2]
|
|
set %1=
|
|
shift
|
|
shift
|
|
rem shift
|
|
goto :checkenvvars
|
|
:executecmd
|
|
%*
|
|
goto :eof
|
|
|
|
:testseta
|
|
rem No output when using "set expr" syntax, unless in interactive mode
|
|
rem Need to use "set envvar=expr" to use in a batch script
|
|
echo ------ individual operations
|
|
set WINE_foo=0
|
|
set /a WINE_foo=1 +2 & call :checkenvvars WINE_foo 3
|
|
set /a WINE_foo=1 +-2 & call :checkenvvars WINE_foo -1
|
|
set /a WINE_foo=1 --2 & call :checkenvvars WINE_foo 3
|
|
set /a WINE_foo=2* 3 & call :checkenvvars WINE_foo 6
|
|
set /a WINE_foo=-2* -5 & call :checkenvvars WINE_foo 10
|
|
set /a WINE_foo=12/3 & call :checkenvvars WINE_foo 4
|
|
set /a WINE_foo=13/3 & call :checkenvvars WINE_foo 4
|
|
set /a WINE_foo=-13/3 & call :checkenvvars WINE_foo -4
|
|
rem FIXME Divide by zero should return an error, but error messages cannot be tested with current infrastructure
|
|
set /a WINE_foo=5 %% 5 & call :checkenvvars WINE_foo 0
|
|
set /a WINE_foo=5 %% 3 & call :checkenvvars WINE_foo 2
|
|
set /a WINE_foo=5 %% -3 & call :checkenvvars WINE_foo 2
|
|
set /a WINE_foo=-5 %% -3 & call :checkenvvars WINE_foo -2
|
|
set /a WINE_foo=1 ^<^< 0 & call :checkenvvars WINE_foo 1
|
|
set /a WINE_foo=1 ^<^< 2 & call :checkenvvars WINE_foo 4
|
|
set /a WINE_foo=1 ^<^< -2 & call :checkenvvars WINE_foo 0
|
|
set /a WINE_foo=-1 ^<^< -2 & call :checkenvvars WINE_foo 0
|
|
set /a WINE_foo=-1 ^<^< 2 & call :checkenvvars WINE_foo -4
|
|
set /a WINE_foo=9 ^>^> 0 & call :checkenvvars WINE_foo 9
|
|
set /a WINE_foo=9 ^>^> 2 & call :checkenvvars WINE_foo 2
|
|
set /a WINE_foo=9 ^>^> -2 & call :checkenvvars WINE_foo 0
|
|
set /a WINE_foo=-9 ^>^> -2 & call :checkenvvars WINE_foo -1
|
|
set /a WINE_foo=-9 ^>^> 2 & call :checkenvvars WINE_foo -3
|
|
set /a WINE_foo=5 ^& 0 & call :checkenvvars WINE_foo 0
|
|
set /a WINE_foo=5 ^& 1 & call :checkenvvars WINE_foo 1
|
|
set /a WINE_foo=5 ^& 3 & call :checkenvvars WINE_foo 1
|
|
set /a WINE_foo=5 ^& 4 & call :checkenvvars WINE_foo 4
|
|
set /a WINE_foo=5 ^& 1 & call :checkenvvars WINE_foo 1
|
|
set /a WINE_foo=5 ^| 0 & call :checkenvvars WINE_foo 5
|
|
set /a WINE_foo=5 ^| 1 & call :checkenvvars WINE_foo 5
|
|
set /a WINE_foo=5 ^| 3 & call :checkenvvars WINE_foo 7
|
|
set /a WINE_foo=5 ^| 4 & call :checkenvvars WINE_foo 5
|
|
set /a WINE_foo=5 ^| 1 & call :checkenvvars WINE_foo 5
|
|
set /a WINE_foo=5 ^^ 0 & call :checkenvvars WINE_foo 5
|
|
set /a WINE_foo=5 ^^ 1 & call :checkenvvars WINE_foo 4
|
|
set /a WINE_foo=5 ^^ 3 & call :checkenvvars WINE_foo 6
|
|
set /a WINE_foo=5 ^^ 4 & call :checkenvvars WINE_foo 1
|
|
set /a WINE_foo=5 ^^ 1 & call :checkenvvars WINE_foo 4
|
|
echo ------ precedence and grouping
|
|
set /a WINE_foo=4 + 2*3 & call :checkenvvars WINE_foo 10
|
|
set /a WINE_foo=(4+2)*3 & call :checkenvvars WINE_foo 18
|
|
set /a WINE_foo=4 * 3/5 & call :checkenvvars WINE_foo 2
|
|
set /a WINE_foo=(4 * 3)/5 & call :checkenvvars WINE_foo 2
|
|
set /a WINE_foo=4 * 5 %% 4 & call :checkenvvars WINE_foo 0
|
|
set /a WINE_foo=4 * (5 %% 4) & call :checkenvvars WINE_foo 4
|
|
set /a WINE_foo=3 %% (5 + 8 %% 3 ^^ 2) & call :checkenvvars WINE_foo 3
|
|
set /a WINE_foo=3 %% (5 + 8 %% 3 ^^ -2) & call :checkenvvars WINE_foo 3
|
|
echo ------ octal and hexadecimal
|
|
set /a WINE_foo=0xf + 3 & call :checkenvvars WINE_foo 18
|
|
set /a WINE_foo=0xF + 3 & call :checkenvvars WINE_foo 18
|
|
set /a WINE_foo=015 + 2 & call :checkenvvars WINE_foo 15
|
|
set /a WINE_foo=3, 8+3,0 & call :checkenvvars WINE_foo 3
|
|
echo ------ variables
|
|
set /a WINE_foo=WINE_bar=3, WINE_bar+1 & call :checkenvvars WINE_foo 3 WINE_bar 3
|
|
set /a WINE_foo=WINE_bar=3, WINE_bar+=1 & call :checkenvvars WINE_foo 3 WINE_bar 4
|
|
set /a WINE_foo=WINE_bar=3, WINE_baz=1, WINE_baz+=WINE_bar, WINE_baz & call :checkenvvars WINE_foo 3 WINE_bar 3 WINE_baz 4
|
|
set WINE_bar=3
|
|
set /a WINE_foo=WINE_bar*= WINE_bar & call :checkenvvars WINE_foo 9 WINE_bar 9
|
|
set /a WINE_foo=WINE_whateverNonExistingVar & call :checkenvvars WINE_foo 0
|
|
set WINE_bar=4
|
|
set /a WINE_foo=WINE_whateverNonExistingVar + WINE_bar & call :checkenvvars WINE_foo 4 WINE_bar 4
|
|
set WINE_bar=4
|
|
set /a WINE_foo=WINE_bar -= WINE_bar + 7 & call :checkenvvars WINE_foo -7 WINE_bar -7
|
|
set WINE_bar=-7
|
|
set /a WINE_foo=WINE_bar /= 3 + 2 & call :checkenvvars WINE_foo -1 WINE_bar -1
|
|
set /a WINE_foo=WINE_bar=5, WINE_bar %%=2 & call :checkenvvars WINE_foo 5 WINE_bar 1
|
|
set WINE_bar=1
|
|
set /a WINE_foo=WINE_bar ^<^<= 2 & call :checkenvvars WINE_foo 4 WINE_bar 4
|
|
set WINE_bar=4
|
|
set /a WINE_foo=WINE_bar ^>^>= 2 & call :checkenvvars WINE_foo 1 WINE_bar 1
|
|
set WINE_bar=1
|
|
set /a WINE_foo=WINE_bar ^&= 2 & call :checkenvvars WINE_foo 0 WINE_bar 0
|
|
set /a WINE_foo=WINE_bar=5, WINE_bar ^|= 2 & call :checkenvvars WINE_foo 5 WINE_bar 7
|
|
set /a WINE_foo=WINE_bar=5, WINE_bar ^^= 2 & call :checkenvvars WINE_foo 5 WINE_bar 7
|
|
set WINE_baz=4
|
|
set /a WINE_foo=WINE_bar=19, WINE_bar %%= 4 + (WINE_baz %%= 7) & call :checkenvvars WINE_foo 19 WINE_bar 3 WINE_baz 4
|
|
echo --- quotes
|
|
set /a WINE_foo=1
|
|
call :checkenvvars WINE_foo 1
|
|
set /a "WINE_foo=1"
|
|
call :checkenvvars WINE_foo 1
|
|
set /a WINE_foo=1,WINE_bar=2
|
|
call :checkenvvars WINE_foo 1 WINE_bar 2
|
|
set /a "WINE_foo=1,WINE_bar=2"
|
|
call :checkenvvars WINE_foo 1 WINE_bar 2
|
|
set /a "WINE_foo=1","WINE_bar=2"
|
|
call :checkenvvars WINE_foo 1 WINE_bar 2
|
|
set /a ""WINE_foo=1","WINE_bar=2""
|
|
call :checkenvvars WINE_foo 1 WINE_bar 2
|
|
set /a WINE_foo=1,WINE_bar=2,WINE_baz=3
|
|
call :checkenvvars WINE_foo 1 WINE_bar 2 WINE_baz 3
|
|
set /a "WINE_foo=1,WINE_bar=2,WINE_baz=3"
|
|
call :checkenvvars WINE_foo 1 WINE_bar 2 WINE_baz 3
|
|
set /a "WINE_foo=1","WINE_bar=2","WINE_baz=3"
|
|
call :checkenvvars WINE_foo 1 WINE_bar 2 WINE_baz 3
|
|
set /a ""WINE_foo=1","WINE_bar=2","WINE_baz=3""
|
|
call :checkenvvars WINE_foo 1 WINE_bar 2 WINE_baz 3
|
|
set /a ""WINE_foo=1","WINE_bar=2"","WINE_baz=3"
|
|
call :checkenvvars WINE_foo 1 WINE_bar 2 WINE_baz 3
|
|
set /a """"""WINE_foo=1""""""
|
|
call :checkenvvars WINE_foo 1
|
|
set /a """"""WINE_foo=1","WINE_bar=5""","WINE_baz=2""
|
|
call :checkenvvars WINE_foo 1 WINE_bar 5 WINE_baz 2
|
|
set /a WINE_foo="3"+"4"+"5+6"
|
|
call :checkenvvars WINE_foo 18
|
|
set WINE_foo=3
|
|
set /a WINE_bar="WINE_""foo"+4
|
|
call :checkenvvars WINE_foo 3 WINE_bar 7
|
|
echo --- whitespace are ignored between double char operators
|
|
set WINE_foo=4
|
|
set WINE_bar=5
|
|
set /a WINE_foo + = 6
|
|
set /a WINE_bar * = WINE_foo
|
|
call :checkenvvars WINE_foo 10 WINE_bar 50
|
|
set WINE_foo=4
|
|
set WINE_bar=5
|
|
set /a WINE_foo + = "6 < < 7"
|
|
set /a WINE_bar * = WINE_foo + WINE_foo
|
|
call :checkenvvars WINE_foo 772 WINE_bar 7720
|
|
set /a WINE_foo=6 7
|
|
set /a WINE_ var1=8
|
|
set WINE_foo=
|
|
echo --- invalid operator sequence
|
|
set WINE_foo=4
|
|
set /a =4
|
|
set /a *=4
|
|
set /a ^>=4"
|
|
set /a ^<=4"
|
|
set /a WINE_foo^>^<=4
|
|
echo %WINE_foo%
|
|
set /a WINE_foo^>^>^>=4
|
|
echo %WINE_foo%
|
|
echo ----- negative prefix
|
|
set /a WINE_foo=-1
|
|
call :checkenvvars WINE_foo -1
|
|
set /a WINE_foo=--1
|
|
call :checkenvvars WINE_foo 1
|
|
set /a WINE_foo=3--3
|
|
call :checkenvvars WINE_foo 6
|
|
set /a WINE_foo=3---3
|
|
call :checkenvvars WINE_foo 0
|
|
set /a WINE_foo=3----3
|
|
call :checkenvvars WINE_foo 6
|
|
set /a WINE_foo=-~1
|
|
call :checkenvvars WINE_foo 2
|
|
set /a WINE_foo=~-1
|
|
call :checkenvvars WINE_foo 0
|
|
set /a WINE_foo=3+-~1
|
|
call :checkenvvars WINE_foo 5
|
|
set /a WINE_foo=3+~-1
|
|
call :checkenvvars WINE_foo 3
|
|
echo ----- assignment tests involving the end destination
|
|
set WINE_foo=3
|
|
set /a WINE_foo+=3+(WINE_foo=4)
|
|
call :checkenvvars WINE_foo 11
|
|
set WINE_foo=2
|
|
set /a WINE_bar=3+(WINE_foo=6)
|
|
call :checkenvvars WINE_foo 6 WINE_bar 9
|
|
set WINE_foo=2
|
|
set /a WINE_bar=3+(WINE_foo=6,WINE_baz=7)
|
|
call :checkenvvars WINE_foo 6 WINE_bar 10 WINE_baz 7
|
|
set WINE_foo=2
|
|
set /a WINE_bar=WINE_foo=7
|
|
call :checkenvvars WINE_foo 7 WINE_bar 7
|
|
echo ----- equal precedence on stack
|
|
rem Unary - don't reduce if precedence is equal
|
|
set /a WINE_foo=!!1
|
|
call :checkenvvars WINE_foo 1
|
|
set /a WINE_foo=!!0
|
|
call :checkenvvars WINE_foo 0
|
|
set /a WINE_foo=~~1
|
|
call :checkenvvars WINE_foo 1
|
|
set /a WINE_foo=~~0
|
|
call :checkenvvars WINE_foo 0
|
|
set /a WINE_foo=--1
|
|
call :checkenvvars WINE_foo 1
|
|
set /a WINE_foo=+-1
|
|
call :checkenvvars WINE_foo -1
|
|
set /a WINE_foo=-+1
|
|
call :checkenvvars WINE_foo -1
|
|
set /a WINE_foo=++1
|
|
call :checkenvvars WINE_foo 1
|
|
set /a WINE_foo=!~1
|
|
call :checkenvvars WINE_foo 0
|
|
set /a WINE_foo=~!1
|
|
call :checkenvvars WINE_foo -1
|
|
set /a WINE_foo=!-1
|
|
call :checkenvvars WINE_foo 0
|
|
set /a WINE_foo=-!1
|
|
call :checkenvvars WINE_foo 0
|
|
set /a WINE_foo=!-0
|
|
call :checkenvvars WINE_foo 1
|
|
set /a WINE_foo=-!0
|
|
call :checkenvvars WINE_foo -1
|
|
rem Aritmatic - Reduce if precedence is equal
|
|
set /a WINE_foo=10*5/2
|
|
call :checkenvvars WINE_foo 25
|
|
set /a WINE_foo=5/2*10
|
|
call :checkenvvars WINE_foo 20
|
|
set /a WINE_foo=10/5/2
|
|
call :checkenvvars WINE_foo 1
|
|
set /a WINE_foo=5%%2*4
|
|
call :checkenvvars WINE_foo 4
|
|
set /a WINE_foo=10-5+2
|
|
call :checkenvvars WINE_foo 7
|
|
set /a WINE_foo=1^<^<4^>^>1
|
|
call :checkenvvars WINE_foo 8
|
|
rem Assignment - don't reduce if precedence is equal
|
|
set /a WINE_foo=5
|
|
set /a WINE_bar=WINE_foo=6
|
|
call :checkenvvars WINE_foo 6 WINE_bar 6
|
|
|
|
echo --- for /F
|
|
mkdir foobar & cd foobar
|
|
echo ------ string argument
|
|
rem NT4 does not support usebackq
|
|
for /F %%i in ("a b c") do echo %%i
|
|
for /f usebackq %%i in ('a b c') do echo %%i>output_file
|
|
if not exist output_file (echo no output) else (type output_file & del output_file)
|
|
for /f %%i in ("a ") do echo %%i
|
|
for /f usebackq %%i in ('a ') do echo %%i>output_file
|
|
if not exist output_file (echo no output) else (type output_file & del output_file)
|
|
for /f %%i in ("a") do echo %%i
|
|
for /f usebackq %%i in ('a') do echo %%i>output_file
|
|
if not exist output_file (echo no output) else (type output_file & del output_file)
|
|
fOr /f %%i in (" a") do echo %%i
|
|
for /f usebackq %%i in (' a') do echo %%i>output_file
|
|
if not exist output_file (echo no output) else (type output_file & del output_file)
|
|
for /f %%i in (" a ") do echo %%i
|
|
for /f usebackq %%i in (' a ') do echo %%i>output_file
|
|
if not exist output_file (echo no output) else (type output_file & del output_file)
|
|
echo ------ fileset argument
|
|
echo --------- basic blank handling
|
|
echo a b c>foo
|
|
for /f %%i in (foo) do echo %%i
|
|
echo a >foo
|
|
for /f %%i in (foo) do echo %%i
|
|
echo a>foo
|
|
for /f %%i in (foo) do echo %%i
|
|
echo a>foo
|
|
for /f %%i in (foo) do echo %%i
|
|
echo a >foo
|
|
for /f %%i in (foo) do echo %%i
|
|
echo. > foo
|
|
for /f %%i in (foo) do echo %%i
|
|
echo. >> foo
|
|
echo b > foo
|
|
for /f %%i in (foo) do echo %%i
|
|
echo --------- multi-line with empty lines
|
|
echo a Z f> foo
|
|
echo. >> foo
|
|
echo.>> foo
|
|
echo b bC>> foo
|
|
echo c>> foo
|
|
echo. >> foo
|
|
for /f %%b in (foo) do echo %%b
|
|
echo --------- multiple files
|
|
echo q w > bar
|
|
echo.>> bar
|
|
echo kkk>>bar
|
|
for /f %%k in (foo bar) do echo %%k
|
|
for /f %%k in (bar foo) do echo %%k
|
|
echo ------ command argument
|
|
rem Not implemented on NT4, need to skip it as no way to get output otherwise
|
|
if "%CD%"=="" goto :SkipFORFcmdNT4
|
|
for /f %%i in ('echo.Passed1') do echo %%i
|
|
for /f "usebackq" %%i in (`echo.Passed2`) do echo %%i
|
|
for /f usebackq %%i in (`echo.Passed3`) do echo %%i
|
|
goto :ContinueFORF
|
|
:SkipFORFcmdNT4
|
|
for /l %%i in (1,1,3) do echo Missing functionality - Broken%%i
|
|
:ContinueFORF
|
|
rem FIXME: Rest not testable right now in wine: not implemented and would need
|
|
rem preliminary grep-like program implementation (e.g. like findstr or fc) even
|
|
rem for a simple todo_wine test
|
|
rem (for /f "usebackq" %%i in (`echo z a b`) do echo %%i) || echo not supported
|
|
rem (for /f usebackq %%i in (`echo z a b`) do echo %%i) || echo not supported
|
|
echo ------ eol option
|
|
if "%CD%"=="" goto :SkipFORFeolNT4
|
|
echo Line one>foo
|
|
echo and Line two>>foo
|
|
echo Line three>>foo
|
|
for /f "eol=L" %%i in (foo) do echo %%i
|
|
for /f "eol=a" %%i in (foo) do echo %%i
|
|
del foo
|
|
goto :ContinueFORFeol
|
|
:SkipFORFeolNT4
|
|
for /l %%i in (1,1,3) do echo Broken NT4 functionality%%i
|
|
:ContinueFORFeol
|
|
for /f "eol=@" %%i in (" ad") do echo %%i
|
|
for /f "eol=@" %%i in (" z@y") do echo %%i
|
|
for /f "eol=|" %%i in ("a|d") do echo %%i
|
|
for /f "eol=@" %%i in ("@y") do echo %%i > output_file
|
|
if not exist output_file (echo no output) else (del output_file)
|
|
for /f "eol==" %%i in ("=y") do echo %%i > output_file
|
|
if not exist output_file (echo no output) else (del output_file)
|
|
echo ------ delims option
|
|
for /f "delims=|" %%i in ("a|d") do echo %%i
|
|
for /f "delims=|" %%i in ("a |d") do echo %%i
|
|
for /f "delims=|" %%i in ("a d|") do echo %%i
|
|
for /f "delims=| " %%i in ("a d|") do echo %%i
|
|
for /f "delims==" %%i in ("C r=d|") do echo %%i
|
|
for /f "delims=" %%i in ("foo bar baz") do echo %%i
|
|
for /f "delims=" %%i in ("c:\foo bar baz\..") do echo %%~fi
|
|
echo ------ skip option
|
|
echo a > foo
|
|
echo b >> foo
|
|
echo c >> foo
|
|
for /f "skip=2" %%i in (foo) do echo %%i
|
|
for /f "skip=3" %%i in (foo) do echo %%i > output_file
|
|
if not exist output_file (echo no output) else (del output_file)
|
|
for /f "skip=4" %%i in (foo) do echo %%i > output_file
|
|
if not exist output_file (echo no output) else (del output_file)
|
|
for /f "skip=02" %%i in (foo) do echo %%i
|
|
for /f "skip=0x2" %%i in (foo) do echo %%i
|
|
for /f "skip=1" %%i in ("skipme") do echo %%i > output_file
|
|
if not exist output_file (echo no output) else (del output_file)
|
|
echo ------ tokens= option
|
|
rem Basic
|
|
for /f %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m o=%%o
|
|
for /f "tokens=2" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m o=%%o
|
|
for /f "tokens=1,3,5-7" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m o=%%o
|
|
rem Show * means the rest
|
|
for /f "tokens=1,5*" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m o=%%o
|
|
for /f "tokens=6,9*" %%i in ("a b c d e f g h i j k l m n o p q r s t u v w x y z") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m o=%%o
|
|
rem Show * means the rest (not tokenized and rebuilt)
|
|
for /f "tokens=6,9*" %%i in ("a b c d e f g h i j k l m n;;== o p q r s t u v w x y z") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m o=%%o
|
|
rem Order is irrelevant
|
|
for /f "tokens=1,2,3*" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m n=%%n o=%%o
|
|
for /f "tokens=3,2,1*" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m n=%%n o=%%o
|
|
rem Duplicates are ignored
|
|
for /f "tokens=1,2,1*" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m n=%%n o=%%o
|
|
rem Large tokens are allowed
|
|
for /f "tokens=25,1,5*" %%i in ("a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m n=%%n o=%%o
|
|
rem Show tokens blanked in advance regardless of uniqueness of requested tokens
|
|
for /f "tokens=1,1,1,2*" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m n=%%n o=%%o
|
|
for /f "tokens=1-2,1-2,1-2" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m n=%%n o=%%o
|
|
rem Show No wrapping from z to A BUT wrapping sort of occurs Z to a occurs
|
|
for /f "tokens=1-20" %%u in ("a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z") do echo u=%%u v=%%v w=%%w x=%%x y=%%y z=%%z A=%%A a=%%a
|
|
for /f "tokens=1-20" %%U in ("a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z") do echo U=%%U V=%%V W=%%W X=%%X Y=%%Y Z=%%Z A=%%A a=%%a
|
|
rem Show negative ranges have no effect
|
|
for /f "tokens=1-3,5" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m o=%%o
|
|
for /f "tokens=3-1,5" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m o=%%o
|
|
rem Show duplicates stop * from working
|
|
for /f "tokens=1,2,3*" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m n=%%n o=%%o
|
|
for /f "tokens=1,1,3*" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m n=%%n o=%%o
|
|
for /f "tokens=2,2,3*" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m n=%%n o=%%o
|
|
for /f "tokens=3,2,3*" %%i in ("a b c d e f g") do echo h=%%h i=%%i j=%%j k=%%k l=%%l m=%%m n=%%n o=%%o
|
|
cd ..
|
|
rd /s/q foobar
|
|
|
|
echo ------------ Testing del ------------
|
|
echo abc > file
|
|
echo deleting 'file'
|
|
del file
|
|
if errorlevel 0 (
|
|
echo errorlevel is 0, good
|
|
) else (
|
|
echo unexpected errorlevel, got %errorlevel%
|
|
)
|
|
if not exist file (
|
|
echo successfully deleted 'file'
|
|
) else (
|
|
echo error deleting 'file'
|
|
)
|
|
echo attempting to delete 'file', even though it is not present
|
|
del file
|
|
if errorlevel 0 (
|
|
echo errorlevel is 0, good
|
|
) else (
|
|
echo unexpected errorlevel, got %errorlevel%
|
|
)
|
|
|
|
echo ------------ Testing del /a ------------
|
|
del /f/q *.test > nul
|
|
echo r > r.test
|
|
attrib +r r.test
|
|
echo not-r > not-r.test
|
|
|
|
if not exist not-r.test echo not-r.test not found before delete, bad
|
|
del /a:-r *.test
|
|
if not exist not-r.test echo not-r.test not found after delete, good
|
|
|
|
if not exist r.test echo r.test not found before delete, bad
|
|
if exist r.test echo r.test found before delete, good
|
|
del /a:r *.test
|
|
if not exist r.test echo r.test not found after delete, good
|
|
if exist r.test echo r.test found after delete, bad
|
|
|
|
echo ------------ Testing del /q ------------
|
|
mkdir del_q_dir
|
|
cd del_q_dir
|
|
echo abc > file1
|
|
echo abc > file2.dat
|
|
rem If /q doesn't work, cmd will prompt and the test case should hang
|
|
del /q * > nul
|
|
for %%a in (1 2.dat) do if exist file%%a echo del /q * failed on file%%a
|
|
for %%a in (1 2.dat) do if not exist file%%a echo del /q * succeeded on file%%a
|
|
cd ..
|
|
rmdir del_q_dir
|
|
|
|
echo ------------ Testing del /s ------------
|
|
mkdir "foo bar"
|
|
cd "foo bar"
|
|
mkdir "foo:"
|
|
echo hi > file1.dat
|
|
echo there > file2.dat
|
|
echo bub > file3.dat
|
|
echo bye > "file with spaces.dat"
|
|
cd ..
|
|
del /s file1.dat > nul
|
|
del file2.dat /s > nul
|
|
del "file3.dat" /s > nul
|
|
del "file with spaces.dat" /s > nul
|
|
cd "foo bar"
|
|
for %%f in (1 2 3) do if exist file%%f.dat echo Del /s failed on file%%f
|
|
for %%f in (1 2 3) do if exist file%%f.dat del file%%f.dat
|
|
if exist "file with spaces.dat" echo Del /s failed on "file with spaces.dat"
|
|
if exist "file with spaces.dat" del "file with spaces.dat"
|
|
rmdir "foo:"
|
|
cd ..
|
|
rmdir "foo bar"
|
|
|
|
echo ------------ Testing rename ------------
|
|
mkdir foobar & cd foobar
|
|
echo --- ren and rename are synonymous
|
|
echo > foo
|
|
rename foo bar
|
|
if exist foo echo foo should be renamed!
|
|
if exist bar echo foo renamed to bar
|
|
ren bar foo
|
|
if exist bar echo bar should be renamed!
|
|
if exist foo echo bar renamed to foo
|
|
echo --- name collision
|
|
echo foo>foo
|
|
echo bar>bar
|
|
ren foo bar 2> nul
|
|
type foo
|
|
type bar
|
|
rem no-op
|
|
ren foo foo
|
|
mkdir baz
|
|
ren foo baz\abc
|
|
echo --- rename read-only files
|
|
echo > file1
|
|
attrib +r file1
|
|
ren file1 file2
|
|
if not exist file1 (
|
|
if exist file2 (
|
|
echo read-only file renamed
|
|
)
|
|
) else (
|
|
echo read-only file not renamed!
|
|
)
|
|
echo --- rename directories
|
|
mkdir rep1
|
|
ren rep1 rep2
|
|
if not exist rep1 (
|
|
if exist rep2 (
|
|
echo dir renamed
|
|
)
|
|
)
|
|
attrib +r rep2
|
|
ren rep2 rep1
|
|
if not exist rep2 (
|
|
if exist rep1 (
|
|
echo read-only dir renamed
|
|
)
|
|
)
|
|
echo --- rename in other directory
|
|
if not exist baz\abc (
|
|
echo rename impossible in other directory
|
|
if exist foo echo original file still present
|
|
) else (
|
|
echo shouldn't rename in other directory!
|
|
if not exist foo echo original file not present anymore
|
|
)
|
|
cd .. & rd /s/q foobar
|
|
|
|
echo ------------ Testing move ------------
|
|
mkdir foobar & cd foobar
|
|
echo --- file move
|
|
echo >foo
|
|
move foo bar > nul 2>&1
|
|
if not exist foo (
|
|
if exist bar (
|
|
echo file move succeeded
|
|
)
|
|
)
|
|
echo bar>bar
|
|
echo baz> baz
|
|
move /Y bar baz > nul 2>&1
|
|
if not exist bar (
|
|
if exist baz (
|
|
echo file move with overwrite succeeded
|
|
)
|
|
) else (
|
|
echo file overwrite impossible!
|
|
del bar
|
|
)
|
|
type baz
|
|
|
|
attrib +r baz
|
|
move baz bazro > nul 2>&1
|
|
if not exist baz (
|
|
if exist bazro (
|
|
echo read-only files are moveable
|
|
move bazro baz > nul 2>&1
|
|
)
|
|
) else (
|
|
echo read-only file not moved!
|
|
)
|
|
attrib -r baz
|
|
mkdir rep
|
|
move baz rep > nul 2>&1
|
|
if not exist baz (
|
|
if exist rep\baz (
|
|
echo file moved in subdirectory
|
|
)
|
|
)
|
|
call :setError 0
|
|
move rep\baz . > nul 2>&1
|
|
move /Y baz baz > nul 2>&1
|
|
if errorlevel 1 (
|
|
echo moving a file to itself should be a no-op!
|
|
) else (
|
|
echo moving a file to itself is a no-op
|
|
)
|
|
echo ErrorLevel: %ErrorLevel%
|
|
call :setError 0
|
|
del baz
|
|
echo --- directory move
|
|
mkdir foo\bar
|
|
mkdir baz
|
|
echo baz2>baz\baz2
|
|
move baz foo\bar > nul 2>&1
|
|
if not exist baz (
|
|
if exist foo\bar\baz\baz2 (
|
|
echo simple directory move succeeded
|
|
)
|
|
)
|
|
call :setError 0
|
|
mkdir baz
|
|
move baz baz > nul 2>&1
|
|
echo moving a directory to itself gives error; errlevel %ErrorLevel%
|
|
echo ------ dir in dir move
|
|
rd /s/q foo
|
|
mkdir foo bar
|
|
echo foo2>foo\foo2
|
|
echo bar2>bar\bar2
|
|
move foo bar > nul 2>&1
|
|
if not exist foo (
|
|
if exist bar (
|
|
dir /b /ad bar
|
|
dir /b /a-d bar
|
|
dir /b bar\foo
|
|
)
|
|
)
|
|
cd .. & rd /s/q foobar
|
|
|
|
echo ------------ Testing mkdir ------------
|
|
call :setError 0
|
|
echo --- md and mkdir are synonymous
|
|
mkdir foobar
|
|
echo %ErrorLevel%
|
|
rmdir foobar
|
|
md foobar
|
|
echo %ErrorLevel%
|
|
rmdir foobar
|
|
echo --- creating an already existing directory/file must fail
|
|
mkdir foobar
|
|
md foobar
|
|
echo %ErrorLevel%
|
|
rmdir foobar
|
|
echo > foobar
|
|
mkdir foobar
|
|
echo %ErrorLevel%
|
|
del foobar
|
|
echo --- multilevel path creation
|
|
mkdir foo
|
|
echo %ErrorLevel%
|
|
mkdir foo\bar\baz
|
|
echo %ErrorLevel%
|
|
cd foo
|
|
echo %ErrorLevel%
|
|
cd bar
|
|
echo %ErrorLevel%
|
|
cd baz
|
|
echo %ErrorLevel%
|
|
echo > ..\..\bar2
|
|
mkdir ..\..\..\foo\bar2
|
|
echo %ErrorLevel%
|
|
del ..\..\bar2
|
|
mkdir ..\..\..\foo\bar2
|
|
echo %ErrorLevel%
|
|
rmdir ..\..\..\foo\bar2
|
|
cd ..
|
|
rmdir baz
|
|
cd ..
|
|
rmdir bar
|
|
cd ..
|
|
rmdir foo
|
|
echo %ErrorLevel%
|
|
echo --- trailing backslashes
|
|
mkdir foo\\\\
|
|
echo %ErrorLevel%
|
|
if exist foo (rmdir foo & echo dir created
|
|
) else ( echo dir not created )
|
|
echo %ErrorLevel%
|
|
echo --- invalid chars
|
|
mkdir ?
|
|
echo mkdir ? gives errorlevel %ErrorLevel%
|
|
call :setError 0
|
|
mkdir ?\foo
|
|
echo mkdir ?\foo gives errorlevel %ErrorLevel%
|
|
call :setError 0
|
|
mkdir foo\?
|
|
echo mkdir foo\? gives errorlevel %ErrorLevel%
|
|
if exist foo (rmdir foo & echo ok, foo created
|
|
) else ( echo foo not created )
|
|
call :setError 0
|
|
mkdir foo\bar\?
|
|
echo mkdir foo\bar\? gives errorlevel %ErrorLevel%
|
|
call :setError 0
|
|
if not exist foo (
|
|
echo bad, foo not created
|
|
) else (
|
|
cd foo
|
|
if exist bar (
|
|
echo ok, foo\bar created
|
|
rmdir bar
|
|
)
|
|
cd ..
|
|
rmdir foo
|
|
)
|
|
echo --- multiple directories at once
|
|
mkdir foobaz & cd foobaz
|
|
mkdir foo bar\baz foobar "bazbaz" .\"zabzab"
|
|
if exist foo (echo foo created) else echo foo not created!
|
|
if exist bar (echo bar created) else echo bar not created!
|
|
if exist foobar (echo foobar created) else echo foobar not created!
|
|
if exist bar\baz (echo bar\baz created) else echo bar\baz not created!
|
|
if exist bazbaz (echo bazbaz created) else echo bazbaz not created!
|
|
if exist zabzab (echo zabzab created) else echo zabzab not created!
|
|
cd .. & rd /s/q foobaz
|
|
call :setError 0
|
|
mkdir foo\*
|
|
echo mkdir foo\* errorlevel %ErrorLevel%
|
|
if exist foo (rmdir foo & echo ok, foo created
|
|
) else ( echo bad, foo not created )
|
|
|
|
echo ------------ Testing rmdir ------------
|
|
call :setError 0
|
|
rem rd and rmdir are synonymous
|
|
mkdir foobar
|
|
rmdir foobar
|
|
echo %ErrorLevel%
|
|
if not exist foobar echo dir removed
|
|
mkdir foobar
|
|
rd foobar
|
|
echo %ErrorLevel%
|
|
if not exist foobar echo dir removed
|
|
rem Removing nonexistent directory
|
|
rmdir foobar
|
|
echo %ErrorLevel%
|
|
rem Removing single-level directories
|
|
echo > foo
|
|
rmdir foo
|
|
echo %ErrorLevel%
|
|
if exist foo echo file not removed
|
|
del foo
|
|
mkdir foo
|
|
echo > foo\bar
|
|
rmdir foo
|
|
echo %ErrorLevel%
|
|
if exist foo echo non-empty dir not removed
|
|
del foo\bar
|
|
mkdir foo\bar
|
|
rmdir foo
|
|
echo %ErrorLevel%
|
|
if exist foo echo non-empty dir not removed
|
|
rmdir foo\bar
|
|
rmdir foo
|
|
rem Recursive rmdir
|
|
mkdir foo\bar\baz
|
|
rmdir /s /Q foo
|
|
if not exist foo (
|
|
echo recursive rmdir succeeded
|
|
) else (
|
|
rd foo\bar\baz
|
|
rd foo\bar
|
|
rd foo
|
|
)
|
|
mkdir foo\bar\baz
|
|
echo foo > foo\bar\brol
|
|
rmdir /s /Q foo 2>&1
|
|
if not exist foo (
|
|
echo recursive rmdir succeeded
|
|
) else (
|
|
rd foo\bar\baz
|
|
del foo\bar\brol
|
|
rd foo\bar
|
|
rd foo
|
|
)
|
|
rem multiples directories at once
|
|
mkdir foobaz & cd foobaz
|
|
mkdir foo
|
|
mkdir bar\baz
|
|
mkdir foobar
|
|
rd /s/q foo bar foobar
|
|
if not exist foo (echo foo removed) else echo foo not removed!
|
|
if not exist bar (echo bar removed) else echo bar not removed!
|
|
if not exist foobar (echo foobar removed) else echo foobar not removed!
|
|
if not exist bar\baz (echo bar\baz removed) else echo bar\baz not removed!
|
|
cd .. & rd /s/q foobaz
|
|
|
|
echo ------------ Testing pushd/popd ------------
|
|
cd
|
|
echo --- popd is no-op when dir stack is empty
|
|
popd
|
|
cd
|
|
echo --- pushing non-existing dir
|
|
pushd foobar
|
|
cd
|
|
echo --- basic behaviour
|
|
mkdir foobar\baz
|
|
pushd foobar
|
|
cd
|
|
popd
|
|
cd
|
|
pushd foobar
|
|
pushd baz
|
|
cd
|
|
popd
|
|
cd
|
|
pushd baz
|
|
popd
|
|
cd
|
|
popd
|
|
cd
|
|
pushd .
|
|
cd foobar\baz
|
|
pushd ..
|
|
cd
|
|
popd
|
|
popd
|
|
cd
|
|
rd /s/q foobar
|
|
|
|
echo ------------ Testing attrib ------------
|
|
rem FIXME Add tests for archive, hidden and system attributes + mixed attributes modifications
|
|
mkdir foobar & cd foobar
|
|
echo foo original contents> foo
|
|
attrib foo
|
|
echo > bar
|
|
echo --- read-only attribute
|
|
rem Read-only files cannot be altered or deleted, unless forced
|
|
attrib +R foo
|
|
attrib foo
|
|
dir /Ar /B
|
|
echo bar>> foo
|
|
type foo
|
|
del foo > NUL 2>&1
|
|
if exist foo (
|
|
echo Read-only file not deleted
|
|
) else (
|
|
echo Should not delete read-only file!
|
|
)
|
|
del /F foo
|
|
if not exist foo (
|
|
echo Read-only file forcibly deleted
|
|
) else (
|
|
echo Should delete read-only file with del /F!
|
|
attrib -r foo
|
|
del foo
|
|
)
|
|
cd .. & rd /s/q foobar
|
|
echo --- recursive behaviour
|
|
mkdir foobar\baz & cd foobar
|
|
echo > level1
|
|
echo > whatever
|
|
echo > baz\level2
|
|
attrib baz\level2
|
|
cd ..
|
|
attrib +R l*vel? /S > nul 2>&1
|
|
cd foobar
|
|
attrib level1
|
|
attrib baz\level2
|
|
echo > bar
|
|
attrib bar
|
|
cd .. & rd /s/q foobar
|
|
echo --- folders processing
|
|
mkdir foobar
|
|
attrib foobar
|
|
cd foobar
|
|
mkdir baz
|
|
echo toto> baz\toto
|
|
attrib +r baz /s /d > nul 2>&1
|
|
attrib baz
|
|
attrib baz\toto
|
|
echo lulu>>baz\toto
|
|
type baz\toto
|
|
echo > baz\lala
|
|
rem Oddly windows allows file creation in a read-only directory...
|
|
if exist baz\lala (echo file created in read-only dir) else echo file not created
|
|
cd .. & rd /s/q foobar
|
|
|
|
echo ------------ Testing assoc ------------
|
|
rem Modifying associations requires some privileges...
|
|
net session >nul 2>&1
|
|
if errorlevel 1 goto :SkipAssoc
|
|
|
|
rem FIXME Can't test error messages in the current test system, so we have to use some kludges
|
|
rem FIXME Revise once || conditional execution is fixed
|
|
mkdir foobar & cd foobar
|
|
echo --- setting association
|
|
assoc .foo > baz
|
|
type baz
|
|
echo ---
|
|
|
|
assoc .foo=bar
|
|
assoc .foo
|
|
|
|
rem association set system-wide
|
|
echo @echo off> tmp.cmd
|
|
echo echo +++>> tmp.cmd
|
|
echo assoc .foo>> tmp.cmd
|
|
cmd /c tmp.cmd
|
|
|
|
echo --- resetting association
|
|
assoc .foo=
|
|
assoc .foo > baz
|
|
type baz
|
|
echo ---
|
|
|
|
rem association removal set system-wide
|
|
cmd /c tmp.cmd > baz
|
|
type baz
|
|
echo ---
|
|
cd .. & rd /s/q foobar
|
|
goto ContinueFType
|
|
:SkipAssoc
|
|
echo --- setting association
|
|
echo ---
|
|
echo .foo=bar
|
|
echo .foo=bar
|
|
echo +++
|
|
echo .foo=bar
|
|
echo --- resetting association
|
|
echo ---
|
|
echo +++
|
|
echo ---
|
|
|
|
|
|
:ContinueFType
|
|
echo ------------ Testing ftype ------------
|
|
rem Modifying associations requires some privileges...
|
|
net session >nul 2>&1
|
|
if errorlevel 1 goto :SkipFType
|
|
rem FIXME Can't test error messages in the current test system, so we have to use some kludges
|
|
rem FIXME Revise once || conditional execution is fixed
|
|
mkdir foobar & cd foobar
|
|
echo --- setting association
|
|
ftype footype> baz
|
|
type baz
|
|
echo ---
|
|
|
|
ftype footype=foo_opencmd
|
|
assoc .foo=footype
|
|
ftype footype
|
|
|
|
rem association set system-wide
|
|
echo @echo off> tmp.cmd
|
|
echo echo +++>> tmp.cmd
|
|
echo ftype footype>> tmp.cmd
|
|
cmd /c tmp.cmd
|
|
|
|
echo --- resetting association
|
|
assoc .foo=
|
|
|
|
rem Removing a file type association doesn't work on XP due to a bug, so a workaround is needed
|
|
setlocal EnableDelayedExpansion
|
|
set WINE_FOO=original value
|
|
ftype footype=
|
|
ftype footype > baz
|
|
for /F %%i in ('type baz') do (set WINE_FOO=buggyXP)
|
|
rem Resetting actually works on wine/NT4, but is reported as failing due to the peculiar test (and non-support for EnabledDelayedExpansion)
|
|
rem FIXME Revisit once a grep-like program like ftype is implemented
|
|
rem (e.g. to check baz's size using dir /b instead)
|
|
echo !WINE_FOO!
|
|
|
|
rem cleanup registry
|
|
echo REGEDIT4> regCleanup.reg
|
|
echo.>> regCleanup.reg
|
|
echo [-HKEY_CLASSES_ROOT\footype]>> regCleanup.reg
|
|
regedit /s regCleanup.reg
|
|
set WINE_FOO=
|
|
endlocal
|
|
cd .. & rd /s/q foobar
|
|
goto ContinueCall
|
|
:SkipFType
|
|
echo --- setting association
|
|
echo ---
|
|
echo footype=foo_opencmd
|
|
echo .foo=footype
|
|
echo footype=foo_opencmd
|
|
echo +++
|
|
echo footype=foo_opencmd
|
|
echo --- resetting association
|
|
echo original value
|
|
|
|
:ContinueCall
|
|
echo ------------ Testing CALL ------------
|
|
mkdir foobar & cd foobar
|
|
echo --- external script
|
|
echo echo foo %%1> foo.cmd
|
|
call foo
|
|
call foo.cmd 8
|
|
echo echo %%1 %%2 > foo.cmd
|
|
call foo.cmd foo
|
|
call foo.cmd foo bar
|
|
call foo.cmd foo ""
|
|
call foo.cmd "" bar
|
|
call foo.cmd foo ''
|
|
call foo.cmd '' bar
|
|
del foo.cmd
|
|
|
|
echo --- internal routines
|
|
call :testRoutine :testRoutine
|
|
goto :endTestRoutine
|
|
:testRoutine
|
|
echo bar %1
|
|
goto :eof
|
|
:endTestRoutine
|
|
|
|
call :testRoutineArgs foo
|
|
call :testRoutineArgs foo bar
|
|
call :testRoutineArgs foo ""
|
|
call :testRoutineArgs "" bar
|
|
call :testRoutineArgs foo ''
|
|
call :testRoutineArgs '' bar
|
|
goto :endTestRoutineArgs
|
|
:testRoutineArgs
|
|
echo %1 %2
|
|
goto :eof
|
|
:endTestRoutineArgs
|
|
|
|
echo --- with builtins
|
|
call mkdir foo
|
|
echo %ErrorLevel%
|
|
if exist foo (echo foo created) else echo foo should exist!
|
|
rmdir foo
|
|
set WINE_FOOBAZ_VAR=foobaz
|
|
call echo Should expand %WINE_FOOBAZ_VAR%
|
|
set WINE_FOOBAZ_VAR=
|
|
echo>batfile
|
|
call dir /b
|
|
echo>robinfile
|
|
if 1==1 call del batfile
|
|
dir /b
|
|
if exist batfile echo batfile shouldn't exist
|
|
rem ... but not for 'if' or 'for'
|
|
call if 1==1 echo bar 2> nul
|
|
echo %ErrorLevel%
|
|
call :setError 0
|
|
call for %%i in (foo bar baz) do echo %%i 2> nul
|
|
echo %ErrorLevel%
|
|
rem First look for programs in the path before trying a builtin
|
|
echo echo non-builtin dir> dir.cmd
|
|
call dir /b
|
|
del dir.cmd
|
|
rem The below line equates to call (, which does nothing, then the
|
|
rem subsequent lines are executed.
|
|
call (
|
|
echo Line one
|
|
echo Line two
|
|
)
|
|
rem The below line equates to call if, which always fails, then the
|
|
rem subsequent lines are executed. Note cmd.exe swallows all lines
|
|
rem starting with )
|
|
call if 1==1 (
|
|
echo Get if
|
|
) else (
|
|
echo ... and else!
|
|
)
|
|
call call call echo passed
|
|
cd .. & rd /s/q foobar
|
|
|
|
echo ------------ Testing SHIFT ------------
|
|
|
|
call :shiftFun p1 p2 p3 p4 p5
|
|
goto :endShiftFun
|
|
|
|
:shiftFun
|
|
echo '%1' '%2' '%3' '%4' '%5'
|
|
shift
|
|
echo '%1' '%2' '%3' '%4' '%5'
|
|
shift@tab@ /1
|
|
echo '%1' '%2' '%3' '%4' '%5'
|
|
shift /2
|
|
echo '%1' '%2' '%3' '%4' '%5'
|
|
shift /-1
|
|
echo '%1' '%2' '%3' '%4' '%5'
|
|
shift /0
|
|
echo '%1' '%2' '%3' '%4' '%5'
|
|
goto :eof
|
|
:endShiftFun
|
|
|
|
echo ------------ Testing cmd invocation ------------
|
|
rem FIXME: only a stub ATM
|
|
echo --- a batch file can delete itself
|
|
echo del foo.cmd>foo.cmd
|
|
cmd /q /c foo.cmd
|
|
if not exist foo.cmd (
|
|
echo file correctly deleted
|
|
) else (
|
|
echo file should be deleted!
|
|
del foo.cmd
|
|
)
|
|
echo --- a batch file can alter itself
|
|
echo echo bar^>foo.cmd>foo.cmd
|
|
cmd /q /c foo.cmd > NUL 2>&1
|
|
if exist foo.cmd (
|
|
type foo.cmd
|
|
del foo.cmd
|
|
) else (
|
|
echo file not created!
|
|
)
|
|
|
|
echo ---------- Testing copy
|
|
md foobar2
|
|
cd foobar2
|
|
rem Note echo adds 0x0d 0x0a on the end of the line in the file
|
|
echo AAA> file1
|
|
echo BBBBBB> file2
|
|
echo CCCCCCCCC> file3
|
|
md dir1
|
|
goto :testcopy
|
|
|
|
:CheckExist
|
|
if exist "%1" (
|
|
echo Passed: Found expected %1
|
|
) else (
|
|
echo Failed: Did not find expected %1
|
|
)
|
|
del /q "%1" >nul 2>&1
|
|
shift
|
|
if not "%1"=="" goto :CheckExist
|
|
goto :eof
|
|
|
|
:CheckNotExist
|
|
if not exist "%1" (
|
|
echo Passed: Did not find %1
|
|
) else (
|
|
echo Failed: Unexpectedly found %1
|
|
del /q "%1" >nul 2>&1
|
|
)
|
|
shift
|
|
if not "%1"=="" goto :CheckNotExist
|
|
goto :eof
|
|
|
|
rem Note: No way to check file size on NT4 so skip the test
|
|
:CheckFileSize
|
|
if not exist "%1" (
|
|
echo Failed: File missing when requested filesize check [%2]
|
|
goto :ContinueFileSizeChecks
|
|
)
|
|
for %%i in (%1) do set WINE_filesize=%%~zi
|
|
if "%WINE_filesize%"=="%2" (
|
|
echo Passed: file size check on %1 [%WINE_filesize%]
|
|
) else (
|
|
if "%WINE_filesize%"=="%%~zi" (
|
|
echo Skipping file size check on NT4
|
|
) else (
|
|
echo Failed: file size check on %1 [%WINE_filesize% != %2]
|
|
)
|
|
)
|
|
:ContinueFileSizeChecks
|
|
shift
|
|
shift
|
|
if not "%1"=="" goto :CheckFileSize
|
|
goto :eof
|
|
|
|
:testcopy
|
|
|
|
rem -----------------------
|
|
rem Simple single file copy
|
|
rem -----------------------
|
|
rem Simple single file copy, normally used syntax
|
|
copy file1 dummy.file >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist dummy.file
|
|
|
|
rem Simple single file copy, destination supplied as two forms of directory
|
|
copy file1 dir1 >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist dir1\file1
|
|
|
|
copy file1 dir1\ >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist dir1\file1
|
|
|
|
rem Simple single file copy, destination supplied as fully qualified destination
|
|
copy file1 dir1\file99 >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist dir1\file99
|
|
|
|
rem Simple single file copy, destination not supplied
|
|
cd dir1
|
|
copy ..\file1 >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist file1
|
|
cd ..
|
|
|
|
rem Simple single file copy, destination supplied as nonexistent directory
|
|
copy file1 dir2\ >nul 2>&1
|
|
if not errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckNotExist dir2 dir2\file1
|
|
|
|
rem -----------------------
|
|
rem Wildcarded copy
|
|
rem -----------------------
|
|
rem Simple single file copy, destination supplied as two forms of directory
|
|
copy file? dir1 >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist dir1\file1 dir1\file2 dir1\file3
|
|
|
|
copy file* dir1\ >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist dir1\file1 dir1\file2 dir1\file3
|
|
|
|
rem Simple single file copy, destination not supplied
|
|
cd dir1
|
|
copy ..\file*.* >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist file1 file2 file3
|
|
cd ..
|
|
|
|
rem Simple wildcarded file copy, destination supplied as nonexistent directory
|
|
copy file? dir2\ >nul 2>&1
|
|
if not errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckNotExist dir2 dir2\file1 dir2\file2 dir2\file3
|
|
|
|
rem ------------------------------------------------
|
|
rem Confirm overwrite works (cannot test prompting!)
|
|
rem ------------------------------------------------
|
|
copy file1 testfile >nul 2>&1
|
|
copy /y file2 testfile >nul 2>&1
|
|
call :CheckExist testfile
|
|
|
|
rem ------------------------------------------------
|
|
rem Test concatenation
|
|
rem ------------------------------------------------
|
|
rem simple case, no wildcards
|
|
copy file1+file2 testfile >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist testfile
|
|
|
|
rem simple case, wildcards, no concatenation
|
|
copy file* testfile >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist testfile
|
|
|
|
rem simple case, wildcards, and concatenation
|
|
echo ddddd > fred
|
|
copy file*+fred testfile >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist testfile
|
|
|
|
rem simple case, wildcards, and concatenation
|
|
copy fred+file* testfile >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist testfile
|
|
|
|
rem Calculate destination name
|
|
copy fred+file* dir1 >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist dir1\fred
|
|
|
|
rem Calculate destination name
|
|
copy fred+file* dir1\ >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist dir1\fred
|
|
|
|
rem Calculate destination name (none supplied)
|
|
cd dir1
|
|
copy ..\fred+..\file* >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist fred
|
|
|
|
copy ..\fr*+..\file1 >nul 2>&1
|
|
if errorlevel 1 echo Incorrect errorlevel
|
|
call :CheckExist fred
|
|
cd ..
|
|
|
|
rem ******************************************************************
|
|
rem ASCII and BINARY tests
|
|
rem Note: hard coded numbers deliberate because need to ensure whether
|
|
rem an additional EOF has been added or not. There is no way to handle
|
|
rem EOFs in batch, so assume if a single byte appears, it's an EOF!
|
|
rem ******************************************************************
|
|
|
|
rem Confirm original sizes of file1,2,3
|
|
call :CheckFileSize file1 5 file2 8 file3 11
|
|
|
|
cd dir1
|
|
|
|
rem ----------------------------------------------
|
|
rem Show concatenation defaults copy to ascii mode
|
|
rem ----------------------------------------------
|
|
rem Simple default copy source to destination (should not append EOF 5)
|
|
copy ..\file1 file1_default >nul 2>&1
|
|
call :CheckFileSize file1_default 5
|
|
|
|
rem Simple binary copy source to destination (should not append EOF 5)
|
|
copy /b ..\file1 file1_default2 >nul 2>&1
|
|
call :CheckFileSize file1_default2 5
|
|
|
|
rem Simple ascii copy source to destination (should append EOF 5+1, 8+1, 11+1)
|
|
copy /a ..\file1 file1_plus_eof >nul 2>&1
|
|
call :CheckFileSize file1_plus_eof 6
|
|
copy /a ..\file2 file2_plus_eof >nul 2>&1
|
|
call :CheckFileSize file2_plus_eof 9
|
|
copy /a ..\file3 file3_plus_eof >nul 2>&1
|
|
call :CheckFileSize file3_plus_eof 12
|
|
|
|
rem Concat 2 files, ascii mode - (only one EOF on the end 5+8+1)
|
|
copy /a ..\file1+..\file2 file12_plus_eof >nul 2>&1
|
|
call :CheckFileSize file12_plus_eof 14
|
|
|
|
rem Concat 2 files, binary mode - (no EOF on the end 5+8)
|
|
copy /b ..\file1+..\file2 file12_no_eof >nul 2>&1
|
|
call :CheckFileSize file12_no_eof 13
|
|
|
|
rem Concat 2 files, default mode - (one EOF on the end 5+8+1)
|
|
copy ..\file1+..\file2 file12_eof2 >nul 2>&1
|
|
call :CheckFileSize file12_eof2 14
|
|
|
|
rem Test copying when destination is one of the sources.
|
|
rem Concat file1+file2+file3 into file1, should produce file1+file2+file3 = 24
|
|
copy /y ..\file? .\ >nul 2>&1
|
|
copy /y /b file1+file2+file3 file1 >nul 2>&1
|
|
call :CheckFileSize file1 24
|
|
|
|
rem Concat file1+file2+file3 into file2, should produce file1+file3 = 16
|
|
copy /y ..\file? .\ >nul 2>&1
|
|
copy /y /b file1+file2+file3 file2 >nul 2>&1
|
|
call :CheckFileSize file2 16
|
|
|
|
rem Concat file1+file2+file3 into file3, should produce file1+file2 = 13
|
|
copy /y ..\file? .\ >nul 2>&1
|
|
copy /y /b file1+file2+file3 file3 >nul 2>&1
|
|
call :CheckFileSize file3 13
|
|
|
|
rem --------------------------------------------------------------
|
|
rem Show ascii source copy stops at first EOF, binary does the lot
|
|
rem --------------------------------------------------------------
|
|
copy file1_plus_eof /b file1_binary_srccopy /b >nul 2>&1
|
|
call :CheckFileSize file1_binary_srccopy 6
|
|
|
|
copy file1_plus_eof /a file1_ascii_srccopy /b >nul 2>&1
|
|
call :CheckFileSize file1_ascii_srccopy 5
|
|
|
|
rem --------------------------------------------------------------
|
|
rem Show results of concatenating files (ending in EOFs) and /a /b
|
|
rem --------------------------------------------------------------
|
|
|
|
rem Default and ascii copy reads as ascii, stripping EOFs, so 6-1 + 9-1 + 12-1 + 1
|
|
copy file1_plus_eof+file2_plus_eof+file3_plus_eof file123_default_copy >nul 2>&1
|
|
call :CheckFileSize file123_default_copy 25
|
|
copy /a file1_plus_eof+file2_plus_eof+file3_plus_eof file123_ascii_copy >nul 2>&1
|
|
call :CheckFileSize file123_ascii_copy 25
|
|
|
|
rem In binary mode, we get 3 eofs, so 6 + 9 + 12 = 27
|
|
copy /b file1_plus_eof + file2_plus_eof + file3_plus_eof file123_binary_copy >nul 2>&1
|
|
call :CheckFileSize file123_binary_copy 27
|
|
|
|
rem We can select which we want the eofs from by postfixing it with /a or /b
|
|
rem so here have first and third with eof, second as ascii 6 + 9-1 + 12
|
|
copy file1_plus_eof /b + file2_plus_eof /a + file3_plus_eof /b file123_mixed_copy1 >nul 2>&1
|
|
call :CheckFileSize file123_mixed_copy1 26
|
|
|
|
rem By postfixing the destination with /a, we ask for an ascii destination which appends EOF
|
|
rem so here have first and third with eof, second as ascii 6 + 9-1 + 12 + extra EOF
|
|
rem Note the delta between this and the previous one also shows that the destination
|
|
rem ascii/binary is inherited from the last /a or /b on the line
|
|
copy file1_plus_eof /b + file2_plus_eof /a + file3_plus_eof /b file123_mixed_copy2 /a >nul 2>&1
|
|
call :CheckFileSize file123_mixed_copy2 27
|
|
|
|
rem so here have second with eof, first and third as ascii 6-1 + 9 + 12-1
|
|
rem Note the delta between the next two also shows that the destination ascii/binary is
|
|
rem inherited from the last /a or /b on the line, so the first has an extra EOF
|
|
copy file1_plus_eof /a + file2_plus_eof /b + file3_plus_eof /a file123_mixed_copy3 >nul 2>&1
|
|
call :CheckFileSize file123_mixed_copy3 26
|
|
copy file1_plus_eof /a + file2_plus_eof /b + file3_plus_eof /a file123_mixed_copy4 /b >nul 2>&1
|
|
call :CheckFileSize file123_mixed_copy4 25
|
|
|
|
rem -------------------------------------------------------------------------------------------
|
|
rem This shows when concatenating, an ascii destination always adds on an EOF but when we
|
|
rem are not concatenating, it's a direct copy regardless of destination if being read as binary
|
|
rem -------------------------------------------------------------------------------------------
|
|
|
|
rem All 3 have eof's, plus an extra = 6 + 9 + 12 + eof
|
|
copy /b file1_plus_eof + file2_plus_eof + file3_plus_eof file123_mixed_copy5 /a >nul 2>&1
|
|
call :CheckFileSize file123_mixed_copy5 28
|
|
|
|
rem All 2 have eof's, plus an extra = 6 + 12 + eof
|
|
copy /b file1_plus_eof + file3_plus_eof file123_mixed_copy6 /a >nul 2>&1
|
|
call :CheckFileSize file123_mixed_copy6 19
|
|
|
|
rem One file has EOF, but doesn't get an extra one, i.e. 6
|
|
copy /b file1_plus_eof file123_mixed_copy7 /a >nul 2>&1
|
|
call :CheckFileSize file123_mixed_copy7 6
|
|
|
|
rem Syntax means concatenate so ascii destination kicks in
|
|
copy /b file1_plus_eof* file123_mixed_copy8 /a >nul 2>&1
|
|
call :CheckFileSize file123_mixed_copy8 7
|
|
|
|
del *.* /q
|
|
cd ..
|
|
|
|
rem ---------------------------------------
|
|
rem Error combinations
|
|
rem ---------------------------------------
|
|
rem Specify source directory but name is a file
|
|
call :setError 0
|
|
copy file1\ dir1\ >NUL 2>&1
|
|
if errorlevel 1 echo Passed: errorlevel invalid check 1
|
|
if not errorlevel 1 echo Failed: errorlevel invalid check 1
|
|
call :CheckNotExist dir1\file1
|
|
|
|
rem Overwrite same file
|
|
call :setError 0
|
|
copy file1 file1 >NUL 2>&1
|
|
if errorlevel 1 echo Passed: errorlevel invalid check 2
|
|
if not errorlevel 1 echo Failed: errorlevel invalid check 2
|
|
|
|
rem Supply same file identified as a directory
|
|
call :setError 0
|
|
copy file1 file1\ >NUL 2>&1
|
|
if errorlevel 1 echo Passed: errorlevel invalid check 3
|
|
if not errorlevel 1 echo Failed: errorlevel invalid check 3
|
|
|
|
cd ..
|
|
rd foobar2 /s /q
|
|
|
|
echo ------------ Testing setlocal/endlocal ------------
|
|
call :setError 0
|
|
rem Note: setlocal EnableDelayedExpansion already tested in the variable delayed expansion test section
|
|
mkdir foobar & cd foobar
|
|
echo --- enable/disable extensions
|
|
setlocal DisableEXTensions
|
|
echo ErrLev: %ErrorLevel%
|
|
endlocal
|
|
echo ErrLev: %ErrorLevel%
|
|
echo @echo off> tmp.cmd
|
|
echo echo ErrLev: %%ErrorLevel%%>> tmp.cmd
|
|
rem Enabled by default
|
|
cmd /C tmp.cmd
|
|
cmd /E:OfF /C tmp.cmd
|
|
cmd /e:oN /C tmp.cmd
|
|
|
|
rem FIXME: creating file before setting envvar value to prevent parsing-time evaluation (due to EnableDelayedExpansion not being implemented/available yet)
|
|
echo --- setlocal with corresponding endlocal
|
|
rem %CD% does not work on NT4 so use the following workaround
|
|
for /d %%i in (.) do set WINE_CURDIR=%%~dpnxi
|
|
echo @echo off> test.cmd
|
|
echo echo %%WINE_VAR%%>> test.cmd
|
|
echo setlocal>> test.cmd
|
|
echo set WINE_VAR=localval>> test.cmd
|
|
echo md foobar2>> test.cmd
|
|
echo cd foobar2>> test.cmd
|
|
echo echo %%WINE_VAR%%>> test.cmd
|
|
echo for /d %%%%i in (.) do echo %%%%~dpnxi>> test.cmd
|
|
echo endlocal>> test.cmd
|
|
echo echo %%WINE_VAR%%>> test.cmd
|
|
echo for /d %%%%i in (.) do echo %%%%~dpnxi>> test.cmd
|
|
set WINE_VAR=globalval
|
|
call test.cmd
|
|
echo %WINE_VAR%
|
|
for /d %%i in (.) do echo %%~dpnxi
|
|
cd /d %WINE_CURDIR%
|
|
rd foobar2
|
|
set WINE_VAR=
|
|
echo --- setlocal with no corresponding endlocal
|
|
echo @echo off> test.cmd
|
|
echo echo %%WINE_VAR%%>> test.cmd
|
|
echo setlocal>> test.cmd
|
|
echo set WINE_VAR=localval>> test.cmd
|
|
echo md foobar2>> test.cmd
|
|
echo cd foobar2>> test.cmd
|
|
echo echo %%WINE_VAR%%>> test.cmd
|
|
echo for /d %%%%i in (.) do echo %%%%~dpnxi>> test.cmd
|
|
set WINE_VAR=globalval
|
|
rem %CD% does not work on NT4 so use the following workaround
|
|
for /d %%i in (.) do set WINE_CURDIR=%%~dpnxi
|
|
call test.cmd
|
|
echo %WINE_VAR%
|
|
for /d %%i in (.) do echo %%~dpnxi
|
|
cd /d %WINE_CURDIR%
|
|
rd foobar2
|
|
set WINE_VAR=
|
|
echo --- setlocal within same batch program
|
|
set WINE_var1=one
|
|
set WINE_var2=
|
|
set WINE_var3=
|
|
rem %CD% does not work on NT4 so use the following workaround
|
|
for /d %%i in (.) do set WINE_CURDIR=%%~dpnxi
|
|
setlocal
|
|
set WINE_var2=two
|
|
mkdir foobar2
|
|
cd foobar2
|
|
setlocal
|
|
set WINE_var3=three
|
|
if "%WINE_var1%"=="one" echo Var1 ok 1
|
|
if "%WINE_var2%"=="two" echo Var2 ok 2
|
|
if "%WINE_var3%"=="three" echo Var3 ok 3
|
|
for /d %%i in (.) do set WINE_curdir2=%%~dpnxi
|
|
if "%WINE_curdir2%"=="%WINE_CURDIR%\foobar2" echo Directory is ok 1
|
|
endlocal
|
|
if "%WINE_var1%"=="one" echo Var1 ok 1
|
|
if "%WINE_var2%"=="two" echo Var2 ok 2
|
|
if "%WINE_var3%"=="" echo Var3 ok 3
|
|
for /d %%i in (.) do set WINE_curdir2=%%~dpnxi
|
|
if "%WINE_curdir2%"=="%WINE_CURDIR%\foobar2" echo Directory is ok 2
|
|
endlocal
|
|
if "%WINE_var1%"=="one" echo Var1 ok 1
|
|
if "%WINE_var2%"=="" echo Var2 ok 2
|
|
if "%WINE_var3%"=="" echo Var3 ok 3
|
|
for /d %%i in (.) do set WINE_curdir2=%%~dpnxi
|
|
if "%WINE_curdir2%"=="%WINE_CURDIR%" echo Directory is ok 3
|
|
rd foobar2 /s /q
|
|
set WINE_var1=
|
|
|
|
echo --- Mismatched set and end locals
|
|
mkdir foodir2 2>nul
|
|
mkdir foodir3 2>nul
|
|
mkdir foodir4 2>nul
|
|
rem %CD% does not work on NT4 so use the following workaround
|
|
for /d %%i in (.) do set WINE_curdir=%%~dpnxi
|
|
|
|
echo @echo off> 2set1end.cmd
|
|
echo echo %%WINE_var%%>> 2set1end.cmd
|
|
echo setlocal>> 2set1end.cmd
|
|
echo set WINE_VAR=2set1endvalue1>> 2set1end.cmd
|
|
echo cd ..\foodir3>> 2set1end.cmd
|
|
echo setlocal>> 2set1end.cmd
|
|
echo set WINE_VAR=2set1endvalue2>> 2set1end.cmd
|
|
echo cd ..\foodir4>> 2set1end.cmd
|
|
echo endlocal>> 2set1end.cmd
|
|
echo echo %%WINE_var%%>> 2set1end.cmd
|
|
echo for /d %%%%i in (.) do echo %%%%~dpnxi>> 2set1end.cmd
|
|
|
|
echo @echo off> 1set2end.cmd
|
|
echo echo %%WINE_var%%>> 1set2end.cmd
|
|
echo setlocal>> 1set2end.cmd
|
|
echo set WINE_VAR=1set2endvalue1>> 1set2end.cmd
|
|
echo cd ..\foodir3>> 1set2end.cmd
|
|
echo endlocal>> 1set2end.cmd
|
|
echo echo %%WINE_var%%>> 1set2end.cmd
|
|
echo for /d %%%%i in (.) do echo %%%%~dpnxi>> 1set2end.cmd
|
|
echo endlocal>> 1set2end.cmd
|
|
echo echo %%WINE_var%%>> 1set2end.cmd
|
|
echo for /d %%%%i in (.) do echo %%%%~dpnxi>> 1set2end.cmd
|
|
|
|
echo --- Extra setlocal in called batch
|
|
set WINE_VAR=value1
|
|
rem -- setlocal1 == this batch, should never be used inside a called routine
|
|
setlocal
|
|
set WINE_var=value2
|
|
cd foodir2
|
|
call "%WINE_CURDIR%\2set1end.cmd"
|
|
echo Finished:
|
|
echo %WINE_VAR%
|
|
for /d %%i in (.) do echo %%~dpnxi
|
|
endlocal
|
|
echo %WINE_VAR%
|
|
for /d %%i in (.) do echo %%~dpnxi
|
|
cd /d %WINE_CURDIR%
|
|
|
|
echo --- Extra endlocal in called batch
|
|
set WINE_VAR=value1
|
|
rem -- setlocal1 == this batch, should never be used inside a called routine
|
|
setlocal
|
|
set WINE_var=value2
|
|
cd foodir2
|
|
call "%WINE_CURDIR%\1set2end.cmd"
|
|
echo Finished:
|
|
echo %WINE_VAR%
|
|
for /d %%i in (.) do echo %%~dpnxi
|
|
endlocal
|
|
echo %WINE_VAR%
|
|
for /d %%i in (.) do echo %%~dpnxi
|
|
cd /d %WINE_CURDIR%
|
|
|
|
echo --- endlocal in called function rather than batch pgm is ineffective
|
|
@echo off
|
|
set WINE_var=1
|
|
set WINE_var2=1
|
|
setlocal
|
|
set WINE_var=2
|
|
call :endlocalroutine
|
|
echo %WINE_var%
|
|
endlocal
|
|
echo %WINE_var%
|
|
goto :endlocalfinished
|
|
:endlocalroutine
|
|
echo %WINE_var%
|
|
endlocal
|
|
echo %WINE_var%
|
|
setlocal
|
|
set WINE_var2=2
|
|
endlocal
|
|
echo %WINE_var2%
|
|
endlocal
|
|
echo %WINE_var%
|
|
echo %WINE_var2%
|
|
goto :eof
|
|
:endlocalfinished
|
|
echo %WINE_var%
|
|
|
|
set WINE_var=
|
|
set WINE_var2=
|
|
cd .. & rd /q/s foobar
|
|
|
|
echo ------------ Testing Errorlevel ------------
|
|
rem WARNING: Do *not* add tests using ErrorLevel after this section
|
|
should_not_exist 2> nul > nul
|
|
echo %ErrorLevel%
|
|
rem nt 4.0 doesn't really support a way of setting errorlevel, so this is weak
|
|
rem See http://www.robvanderwoude.com/exit.php
|
|
call :setError 1
|
|
echo %ErrorLevel%
|
|
if errorlevel 2 echo errorlevel too high, bad
|
|
if errorlevel 1 echo errorlevel just right, good
|
|
if errorlevel 01 echo errorlevel with leading zero just right, good
|
|
if errorlevel -1 echo errorlevel with negative number OK
|
|
if errorlevel 0x1 echo hexa should not be recognized!
|
|
if errorlevel 1a echo invalid error level recognized!
|
|
call :setError 0
|
|
echo abc%ErrorLevel%def
|
|
if errorlevel 1 echo errorlevel nonzero, bad
|
|
if not errorlevel 1 echo errorlevel zero, good
|
|
if not errorlevel 0x1 echo hexa should not be recognized!
|
|
if not errorlevel 1a echo invalid error level recognized!
|
|
rem Now verify that setting a real variable hides its magic variable
|
|
set errorlevel=7
|
|
echo %ErrorLevel% should be 7
|
|
if errorlevel 7 echo setting var worked too well, bad
|
|
call :setError 3
|
|
echo %ErrorLevel% should still be 7
|
|
|
|
echo ------------ Testing GOTO ------------
|
|
if a==a goto dest1
|
|
echo FAILURE at dest 1
|
|
:dest1
|
|
echo goto with no leading space worked
|
|
if a==a goto :dest1b
|
|
echo FAILURE at dest 1b
|
|
:dest1b
|
|
echo goto with colon and no leading space worked
|
|
if b==b goto dest2
|
|
echo FAILURE at dest 2
|
|
:dest2
|
|
echo goto with a leading space worked
|
|
if c==c goto dest3
|
|
echo FAILURE at dest 3
|
|
:dest3
|
|
echo goto with a leading tab worked
|
|
if d==d goto dest4
|
|
echo FAILURE at dest 4
|
|
:dest4@space@
|
|
echo goto with a following space worked
|
|
if e==e goto dest5
|
|
echo FAILURE at dest 5
|
|
:dest5&& echo FAILURE
|
|
echo goto with following amphersands worked
|
|
|
|
del failure.txt >nul 2>&1
|
|
if f==f goto dest6
|
|
echo FAILURE at dest 6
|
|
:dest6>FAILURE.TXT
|
|
if exist FAILURE.TXT echo FAILURE at dest 6 as file exists
|
|
echo goto with redirections worked
|
|
del FAILURE.TXT >nul 2>&1
|
|
|
|
:: some text that is ignored | dir >cmd_output | another test
|
|
if exist cmd_output echo FAILURE at dest 6 as file exists
|
|
echo Ignoring double colons worked
|
|
del cmd_output >nul 2>&1
|
|
|
|
rem goto a label which does not exist issues an error message and
|
|
rem acts the same as goto :EOF, and ensure ::label is never matched
|
|
del testgoto.bat >nul 2>&1
|
|
echo goto :dest7 ^>nul 2^>^&1 >> testgoto.bat
|
|
echo echo FAILURE at dest 7 - Should have not found label and issued an error plus ended the batch>> testgoto.bat
|
|
echo ::dest7>> testgoto.bat
|
|
echo echo FAILURE at dest 7 - Incorrectly went to label >> testgoto.bat
|
|
call testgoto.bat
|
|
del testgoto.bat >nul 2>&1
|
|
|
|
del testgoto.bat >nul 2>&1
|
|
echo goto ::dest8 ^>nul 2^>^&1 >> testgoto.bat
|
|
echo echo FAILURE at dest 8 - Should have not found label and issued an error plus ended the batch>> testgoto.bat
|
|
echo ::dest8>> testgoto.bat
|
|
echo echo FAILURE at dest 8 - Incorrectly went to label >> testgoto.bat
|
|
call testgoto.bat
|
|
del testgoto.bat >nul 2>&1
|
|
|
|
if g==g goto dest9
|
|
echo FAILURE at dest 9
|
|
:dest91
|
|
echo FAILURE at dest 91
|
|
@ : dest9>rubbish
|
|
echo label with mixed whitespace and no echo worked
|
|
|
|
if h==h goto :dest10:this is ignored
|
|
echo FAILURE at dest 10
|
|
:dest10:this is also ignored
|
|
echo Correctly ignored trailing information
|
|
|
|
echo ------------ Testing PATH ------------
|
|
set WINE_backup_path=%path%
|
|
set path=original
|
|
path
|
|
path try2
|
|
path
|
|
path=try3
|
|
path
|
|
set path=%WINE_backup_path%
|
|
set WINE_backup_path=
|
|
|
|
echo ------------ Testing combined CALLs/GOTOs ------------
|
|
echo @echo off>foo.cmd
|
|
echo goto :eof>>foot.cmd
|
|
echo :eof>>foot.cmd
|
|
echo echo world>>foo.cmd
|
|
|
|
echo @echo off>foot.cmd
|
|
echo echo cheball>>foot.cmd
|
|
echo.>>foot.cmd
|
|
echo call :bar>>foot.cmd
|
|
echo if "%%1"=="deleteMe" (del foot.cmd)>>foot.cmd
|
|
echo goto :eof>>foot.cmd
|
|
echo.>>foot.cmd
|
|
echo :bar>>foot.cmd
|
|
echo echo barbare>>foot.cmd
|
|
echo goto :eof>>foot.cmd
|
|
|
|
call foo.cmd
|
|
call foot
|
|
call :bar
|
|
del foo.cmd
|
|
rem Script execution stops after the following line
|
|
foot deleteMe
|
|
call :foo
|
|
call :foot
|
|
goto :endFuns
|
|
|
|
:foot
|
|
echo foot
|
|
|
|
:foo
|
|
echo foo
|
|
goto :eof
|
|
|
|
:endFuns
|
|
|
|
:bar
|
|
echo bar
|
|
call :foo
|
|
|
|
:baz
|
|
echo baz
|
|
goto :eof
|
|
|
|
echo Final message is not output since earlier 'foot' processing stops script execution
|
|
echo Do NOT add any tests below this line
|
|
|
|
echo ------------ Done, jumping to EOF -----------
|
|
goto :eof
|
|
rem Subroutine to set errorlevel and return
|
|
rem in windows nt 4.0, this always sets errorlevel 1, since /b isn't supported
|
|
:setError
|
|
exit /B %1
|
|
rem This line runs under cmd in windows NT 4, but not in more modern versions.
|