2010-02-16 20:42:18 +01:00
|
|
|
echo Tests for cmd's builtin commands
|
2010-02-09 19:11:15 +01:00
|
|
|
|
2010-11-05 22:15:45 +01:00
|
|
|
@echo on
|
|
|
|
echo ------------ Testing 'echo' [ON] --------------
|
|
|
|
echo word
|
|
|
|
echo 'singlequotedword'
|
|
|
|
echo "doublequotedword"
|
|
|
|
@echo at-echoed-word
|
|
|
|
echo "/?"
|
|
|
|
echo.
|
|
|
|
echo .
|
|
|
|
echo.word
|
|
|
|
echo .word
|
|
|
|
echo word@space@
|
|
|
|
echo word@space@@space@
|
|
|
|
|
|
|
|
@echo off
|
|
|
|
echo ------------ Testing 'echo' [OFF] --------------
|
2010-02-09 19:11:15 +01:00
|
|
|
echo word
|
|
|
|
echo 'singlequotedword'
|
|
|
|
echo "doublequotedword"
|
|
|
|
@echo at-echoed-word
|
|
|
|
echo "/?"
|
|
|
|
echo.
|
|
|
|
echo .
|
2010-09-08 00:59:43 +02:00
|
|
|
echo.word
|
|
|
|
echo .word
|
2010-11-05 22:15:45 +01:00
|
|
|
echo word@space@
|
|
|
|
echo word@space@@space@
|
2010-02-16 21:25:41 +01:00
|
|
|
|
|
|
|
echo ------------ Testing 'set' --------------
|
2011-07-17 22:48:56 +02:00
|
|
|
echo %ErrorLevel%
|
|
|
|
set FOOBAR 2> nul > nul
|
|
|
|
echo %ErrorLevel%
|
|
|
|
set FOOBAR = baz
|
|
|
|
echo %ErrorLevel%
|
|
|
|
echo %FOOBAR%FOOBAR not defined
|
|
|
|
echo %FOOBAR %
|
|
|
|
set FOOBAR 2> nul
|
|
|
|
set FOOBAR = baz2
|
|
|
|
echo %ErrorLevel%
|
|
|
|
echo %fOObAr %
|
|
|
|
set FOOBAR= bar
|
|
|
|
echo %ErrorLevel%
|
|
|
|
echo %FOOBAR%
|
|
|
|
set FOO
|
|
|
|
set FOOBAR=
|
|
|
|
set FOOB
|
|
|
|
echo %FOOBAR%FOOBAR not defined
|
|
|
|
set FOOBAR =
|
|
|
|
set FOOBA 2> nul > nul
|
|
|
|
echo %ErrorLevel%
|
|
|
|
set FOO=bar
|
|
|
|
echo %FOO%
|
|
|
|
set FOO=foo
|
|
|
|
set BAR=bar
|
|
|
|
echo %FOO%%BAR%
|
|
|
|
set BAR=
|
|
|
|
set FOO=
|
|
|
|
set FOO=%FOO%
|
|
|
|
echo %FOO%FOO not defined
|
|
|
|
set BAZ%=bazbaz
|
|
|
|
set BA
|
|
|
|
echo %BAZ%%
|
|
|
|
set BAZ%=
|
2010-02-16 21:25:41 +01:00
|
|
|
echo set "FOO=bar" should not include the quotes in the variable value
|
|
|
|
set "FOO=bar"
|
|
|
|
echo %FOO%
|
2011-07-17 22:48:56 +02:00
|
|
|
set FOO=
|
2010-02-16 21:44:16 +01:00
|
|
|
|
|
|
|
echo ------------ Testing variable expansion --------------
|
2011-07-17 22:48:56 +02:00
|
|
|
call :setError 0
|
2010-02-16 21:44:16 +01:00
|
|
|
echo ~dp0 should be directory containing batch file
|
|
|
|
echo %~dp0
|
|
|
|
mkdir dummydir
|
|
|
|
cd dummydir
|
|
|
|
echo %~dp0
|
|
|
|
cd ..
|
|
|
|
rmdir dummydir
|
2010-03-18 01:28:19 +01:00
|
|
|
echo CD value %CD%
|
2010-03-09 13:15:35 +01:00
|
|
|
echo %%
|
|
|
|
echo P%
|
|
|
|
echo %P
|
|
|
|
echo %UNKNOWN%S
|
|
|
|
echo P%UNKNOWN%
|
|
|
|
echo P%UNKNOWN%S
|
|
|
|
echo %ERRORLEVEL
|
|
|
|
echo %ERRORLEVEL%
|
|
|
|
echo %ERRORLEVEL%%ERRORLEVEL%
|
2010-03-16 10:54:26 +01:00
|
|
|
echo %ERRORLEVEL%ERRORLEVEL%
|
2010-03-09 13:15:35 +01:00
|
|
|
echo %ERRORLEVEL%%
|
|
|
|
echo %ERRORLEVEL%%%
|
|
|
|
echo P%ERRORLEVEL%
|
|
|
|
echo %ERRORLEVEL%S
|
|
|
|
echo P%ERRORLEVEL%S
|
2010-02-18 08:11:04 +01:00
|
|
|
|
2011-07-14 20:07:14 +02:00
|
|
|
echo ------------ Testing type ------------
|
|
|
|
echo bar> foobaz
|
|
|
|
@echo on
|
|
|
|
type foobaz
|
|
|
|
echo ***
|
|
|
|
@echo off
|
|
|
|
type foobaz
|
|
|
|
echo ***
|
|
|
|
del foobaz
|
|
|
|
|
2010-02-18 08:11:04 +01:00
|
|
|
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
|
|
|
|
)
|
2011-07-11 23:07:03 +02:00
|
|
|
if /c==/c (
|
|
|
|
echo if seems not to detect /c as parameter
|
|
|
|
) else (
|
|
|
|
echo parameter detection seems to be broken
|
|
|
|
)
|
2010-02-19 06:39:32 +01:00
|
|
|
echo Testing 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
|
2010-03-24 04:45:49 +01:00
|
|
|
|
2011-07-11 23:34:05 +02:00
|
|
|
echo -----------Testing for -----------
|
|
|
|
for %%i in (A B C) do echo %%i
|
|
|
|
for %%i in (A B C) do call :forTestFun1 %%i
|
|
|
|
goto :endForTestFun1
|
|
|
|
:forTestFun1
|
|
|
|
echo %1
|
|
|
|
goto :eof
|
|
|
|
:endForTestFun1
|
|
|
|
for %%i in (X) do (
|
|
|
|
for %%j in (Y) do (
|
|
|
|
echo %%i %%j ))
|
|
|
|
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
|
|
|
|
|
2011-05-22 17:27:38 +02:00
|
|
|
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
|
|
|
|
|
2011-05-30 05:19:00 +02:00
|
|
|
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
|
|
|
|
|
2011-06-02 04:12:56 +02:00
|
|
|
echo ------------ Testing del /s --------------
|
|
|
|
mkdir "foo bar"
|
|
|
|
cd "foo bar"
|
|
|
|
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"
|
|
|
|
cd ..
|
|
|
|
rmdir "foo bar"
|
|
|
|
|
2011-07-11 23:34:06 +02:00
|
|
|
echo ----------- Testing mkdir -----------
|
|
|
|
call :setError 0
|
|
|
|
rem md and mkdir are synonymous
|
|
|
|
mkdir foobar
|
|
|
|
echo %ErrorLevel%
|
|
|
|
rmdir foobar
|
|
|
|
md foobar
|
|
|
|
echo %ErrorLevel%
|
|
|
|
rmdir foobar
|
|
|
|
rem Creating an already existing directory/file must fail
|
|
|
|
mkdir foobar
|
|
|
|
md foobar
|
|
|
|
echo %ErrorLevel%
|
|
|
|
rmdir foobar
|
|
|
|
echo > foobar
|
|
|
|
mkdir foobar
|
|
|
|
echo %ErrorLevel%
|
|
|
|
del foobar
|
|
|
|
rem Multi-level 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%
|
2011-07-11 23:34:07 +02:00
|
|
|
rem Trailing backslashes
|
|
|
|
mkdir foo\\\\
|
|
|
|
echo %ErrorLevel%
|
|
|
|
if exist foo (rmdir foo && echo dir created
|
|
|
|
) else ( echo dir not created )
|
|
|
|
echo %ErrorLevel%
|
|
|
|
rem Invalid chars
|
|
|
|
mkdir ?
|
|
|
|
echo %ErrorLevel%
|
|
|
|
call :setError 0
|
|
|
|
mkdir ?\foo
|
|
|
|
echo %ErrorLevel%
|
|
|
|
call :setError 0
|
|
|
|
mkdir foo\?
|
|
|
|
echo %ErrorLevel%
|
|
|
|
if exist foo (rmdir foo && echo ok, foo created
|
|
|
|
) else ( echo foo not created )
|
|
|
|
call :setError 0
|
|
|
|
mkdir foo\bar\?
|
|
|
|
echo %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
|
|
|
|
)
|
2011-07-11 23:34:06 +02:00
|
|
|
|
2011-07-11 23:34:08 +02:00
|
|
|
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 non-existent 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
|
|
|
|
|
2011-05-26 06:42:37 +02:00
|
|
|
echo -----------Testing 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
|
|
|
|
call :setError 0
|
|
|
|
echo abc%ErrorLevel%def
|
|
|
|
if errorlevel 1 echo errorlevel nonzero, bad
|
|
|
|
if not errorlevel 1 echo errorlevel zero, good
|
|
|
|
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
|
|
|
|
|
2010-03-24 04:45:49 +01:00
|
|
|
echo -----------Testing GOTO-----------
|
|
|
|
if a==a goto dest1
|
|
|
|
:dest1
|
|
|
|
echo goto with no leading space worked
|
|
|
|
if b==b goto dest2
|
|
|
|
:dest2
|
|
|
|
echo goto with a leading space worked
|
|
|
|
if c==c goto dest3
|
|
|
|
:dest3
|
|
|
|
echo goto with a leading tab worked
|
2010-12-13 00:04:19 +01:00
|
|
|
if d==d goto dest4
|
|
|
|
:dest4@space@
|
|
|
|
echo goto with a following space worked
|
2011-05-26 06:42:37 +02:00
|
|
|
|
|
|
|
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.
|