@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 ------ 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% 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*.* exit :setError exit /B %1