| @echo off |
| mkdir foobar |
| cd foobar |
| echo file1 > file1 |
| |
| rem Basic test of command line. Note a section prefix per command |
| rem to resync, as wine does not output anything in these cases yet. |
| echo --- Test 1 |
| cmd.exe /c echo Line1 |
| cmd.exe /c echo "Line2" |
| echo --- Test 2 |
| cmd.exe /c echo Test quotes "&" work |
| echo --- Test 3 |
| cmd.exe /c echo "&" |
| echo --- Test 4 |
| cmd.exe /c echo "<" |
| echo --- Test 5 |
| cmd.exe /c echo ">" |
| echo --- Test 6 |
| cmd.exe /c echo "\" |
| echo --- Test 7 |
| cmd.exe /c echo "|" |
| echo --- Test 8 |
| cmd.exe /c echo "`" |
| echo --- Test 9 |
| cmd.exe /c echo """ |
| echo --- Test 10 |
| echo on > file3 |
| @type file3 |
| @echo off |
| echo --- Test 11 |
| cmd.exe /c echo on >file3 |
| @type file3 |
| @echo off |
| echo --- Test 12 |
| cmd.exe /c "echo passed1" |
| echo --- Test 13 |
| cmd.exe /c " echo passed2 " |
| echo --- Test 14 |
| cmd.exe /c "dir /ad ..\fooba* /b" |
| echo --- Test 15 |
| cmd.exe /cecho No whitespace |
| echo --- Test 16 |
| cmd.exe /c |
| echo --- Test 17 |
| cmd.exe /c@space@ |
| echo --- Test 18 |
| rem Ensure no interactive prompting when cmd.exe /c or /k |
| echo file2 > file2 |
| cmd.exe /c copy file1 file2 >nul |
| echo No prompts or I would not get here1 |
| rem - Try cmd.exe /k as well |
| cmd.exe /k "copy file1 file2 >nul && exit" |
| echo No prompts or I would not get here2 |
| |
| rem Nonexistent variable expansion is as per command line, i.e. left as-is |
| cmd.exe /c echo %%hello1%% |
| cmd.exe /c echo %%hello2 |
| cmd.exe /c echo %%hello3^:h=t%% |
| cmd.exe /c echo %%hello4%%%% |
| |
| rem Cannot issue a call from cmd.exe /c |
| cmd.exe /c call :hello5 |
| |
| rem %1-9 has no meaning |
| cmd.exe /c echo one = %%1 |
| |
| rem for loop vars need expanding |
| cmd.exe /c for /L %%i in (1,1,5) do @echo %%i |
| |
| rem goto's are ineffective |
| cmd.exe /c goto :fred |
| cmd.exe /c goto eof |
| |
| rem - %var% is expanded at read time, not execute time |
| set var=11 |
| cmd.exe /c "set var=22 && setlocal && set var=33 && endlocal && echo var contents: %%var%%" |
| |
| rem - endlocal ineffective on cmd.exe /c lines |
| cmd.exe /c "set var=22 && setlocal && set var=33 && endlocal && set var" |
| set var=99 |
| |
| rem - Environment is inherited ok |
| cmd.exe /c ECHO %%VAR%% |
| |
| rem - Exit works |
| cmd.exe /c exit |
| |
| cd .. |
| rd foobar /s /q |
| |
| rem - Temporary batch files |
| echo @echo 0 > "say.bat" |
| echo @echo 1 > "say one.bat" |
| echo @echo 2 > "saytwo.bat" |
| echo @echo 3 > "say (3).bat" |
| echo @echo 4 > "say .bat" |
| echo @echo 5 > "bazbaz(5).bat" |
| |
| echo ------ Testing invocation of batch files ---------- |
| call say one |
| call "say one" |
| call "say"" one" |
| call "say one |
| call :setError 0 |
| call say" one" |
| if errorlevel 2 echo error %ErrorLevel% |
| call say "one" |
| call :setError 0 |
| call s"ay one |
| if errorlevel 2 echo error %ErrorLevel% |
| call :setError 0 |
| call s"aytwo |
| if errorlevel 2 echo error %ErrorLevel% |
| call say (3) |
| call "say (3)" |
| call :setError 0 |
| call say" (3)" |
| if errorlevel 2 echo error %ErrorLevel% |
| call :setError 0 |
| call say" "(3) prints 4?! |
| if errorlevel 2 echo error %ErrorLevel% |
| |
| echo ------ Testing invocation with CMD /C ------------- |
| cmd /c say one |
| cmd /c "say one" |
| call :setError 0 |
| cmd /c "say"" one" |
| if errorlevel 2 echo error %ErrorLevel% |
| cmd /c "say one |
| call :setError 0 |
| cmd /c say" one" |
| if errorlevel 2 echo error %ErrorLevel% |
| cmd /c say "one" |
| call :setError 0 |
| cmd /c s"ay one |
| if errorlevel 2 echo error %ErrorLevel% |
| call :setError 0 |
| cmd /c s"aytwo |
| if errorlevel 2 echo error %ErrorLevel% |
| cmd /c say (3) |
| call :setError 0 |
| cmd /c say" (3)" |
| if errorlevel 2 echo error %ErrorLevel% |
| call :setError 0 |
| cmd /c say" "(3) prints 4?! |
| if errorlevel 2 echo error %ErrorLevel% |
| call :setError 0 |
| rem Deliberately invoking a fully qualified batch name containing a bracket |
| rem should fail, as a bracket is a command delimiter. |
| cmd /c "bazbaz(5).bat" |
| if errorlevel 1 echo Passed |
| |
| echo ---------- Testing CMD /C quoting ----------------- |
| cmd /c @echo "hi" |
| call :setError 0 |
| cmd /c say" "one |
| if errorlevel 2 echo error %ErrorLevel% |
| cmd /c @echo "\"\\"\\\"\\\\" "\"\\"\\\"\\\\" |
| rem ---- all 5 conditions met, quotes preserved |
| cmd /c "say one" |
| rem cond 1 - /s |
| cmd /s/c "say one" |
| cmd /s/c ""say one"" |
| rem cond 2 - not 2 quotes |
| cmd /c "say one |
| call :setError 0 |
| cmd /c "say"" one" |
| if errorlevel 2 echo error %ErrorLevel% |
| rem cond 3 - special char - first test fails on Vista, W2K8! |
| cmd /c "say (3)" |
| cmd /c ""say (3)"" |
| rem cond 4 - no spaces (quotes make no difference here) |
| cmd /c saytwo |
| cmd /c "saytwo" |
| cmd /c "saytwo |
| rem cond 5 - string between quotes must be name of executable |
| cmd /c "say five" |
| echo @echo 5 >"say five.bat" |
| cmd /c "say five" |
| |
| echo ------- Testing CMD /C qualifier treatment ------------ |
| rem no need for space after /c |
| cmd /csay one |
| cmd /c"say one" |
| rem ignore quote before qualifier |
| rem FIXME the next command in wine starts a sub-CMD |
| echo THIS FAILS: cmd "/c"say one |
| rem ignore anything before /c |
| rem FIXME the next command in wine starts a sub-CMD |
| echo THIS FAILS: cmd ignoreme/c say one |
| |
| echo --------- Testing special characters -------------- |
| echo @echo amp > "say&.bat" |
| call say& |
| echo @echo ( > "say(.bat" |
| call say( |
| echo @echo ) > "say).bat" |
| call say) |
| echo @echo [ > "say[.bat" |
| call say[ |
| echo @echo ] > "say].bat" |
| call say] |
| echo @echo { > "say{.bat" |
| call say{ |
| echo @echo } > "say}.bat" |
| call say} |
| echo @echo = > "say=.bat" |
| call say= |
| echo @echo sem > "say;.bat" |
| call say; |
| setlocal DisableDelayedExpansion |
| echo @echo ! > "say!.bat" |
| call say! |
| endlocal |
| setlocal EnableDelayedExpansion |
| call say! |
| endlocal |
| echo @echo %%%% > "say%%.bat" |
| call say%% |
| echo @echo ' > "say'.bat" |
| call say' |
| echo @echo + > "say+.bat" |
| call say+ |
| echo @echo com > "say,.bat" |
| call say, |
| echo @echo ` > "say`.bat" |
| call say' |
| echo @echo ~ > "say~.bat" |
| call say~ |
| |
| echo --------- Testing parameter passing -------------- |
| echo @echo 1:%%1,2:%%2 > tell.bat |
| call tell 1 |
| call tell (1) |
| call tell 1(2) |
| call :setError 0 |
| call tell(1) |
| if errorlevel 2 echo error %ErrorLevel% |
| call :setError 0 |
| call tell((1)) |
| if errorlevel 2 echo error %ErrorLevel% |
| call :setError 0 |
| call tell(1)(2) |
| if errorlevel 2 echo error %ErrorLevel% |
| call :setError 0 |
| call tell(1);,;(2) |
| if errorlevel 2 echo error %ErrorLevel% |
| call :setError 0 |
| call tell;1 2 |
| if errorlevel 2 echo error %ErrorLevel% |
| call :setError 0 |
| call tell; 1, ;2 |
| if errorlevel 2 echo error %ErrorLevel% |
| call :setError 0 |
| call tell;1;;2 |
| if errorlevel 2 echo error %ErrorLevel% |
| call tell "p "1 p" "2 |
| call tell p"1 p";2 |
| |
| echo --------- Testing delimiters and parameter passing -------------- |
| echo @echo 0:%%0,1:%%1,2:%%2,All:'%%*'> tell.bat |
| call;tell 1 2 |
| call tell 1 2 |
| ==call==tell==1==2 |
| call tell(1234) |
| call tell(12(34) |
| call tell(12;34) |
| echo --------- Finished -------------- |
| del tell.bat say*.* bazbaz*.bat |
| exit |
| :setError |
| exit /B %1 |