https://bugs.winehq.org/show_bug.cgi?id=50132
Bug ID: 50132 Summary: Command line: Incorrect behaviors in FOR () and IF () blocks Product: Wine Version: 5.21 Hardware: x86-64 OS: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: cmd Assignee: wine-bugs@winehq.org Reporter: Psycho-A@yandex.ru Distribution: ---
The native CMD.exe contains many syntax and other errors related to the FOR and IF commands processing inside of ()-blocks. This is very importans for apps that require complex batch scripts on run. Let's begin.
Case 1: ------- Different behavior when using brackets after "DO"
:: Returns ")" error: for %%a in (*.txt) do if #==# ( echo File: "%%~a" ) :: Works normal: for %%a in (*.txt) do (if #==# ( echo File: "%%~a" )) :: Works normal: for %%a in (*.txt) do if #==# echo File: "%%~a"
In Windows CMD all three results works the same (returns ECHO text).
Case 2: ------- Reading empty lines of text file if EOL=# specified
:: ECHO will return "" text here: for /f "usebackq eol=: tokens=1" %%a in ("File.txt") do ( echo "%%~a" )
Windows CMD skips empty lines anyway.
Case 3: ------- Error behavior if an empty line with Space ot Tab is defined in body
:: Will return ")" error: if #==# ( echo Some text
) :: Just will show ECHO text: if #==# ( echo Some text )
Case 4: ------- Not-expanding variables from parent cycle child one
:: Will show "%~m" in child cycles: for %%f in (*.txt) do ( echo In parent cycle: "%%~f" for %%x in ("%%~f") do ( echo In child cycle: "%%~x" ) ) :: Will seek in "%~f" dir instead of "Folder1": for %%f in ("Folder1") do ( for /r "%%~f" %%x in (*.txt) do ( echo "%%~x" ) )
Windows CMD expands "%%f" in any child cycle's place.
Case 5: ------- Error if no quotes in file/command condition
:: Returns "DO is not an application" error: for /f %%a in (File.txt) do ( echo "%%~a" ) :: Reads strings of File.txt: for /f "usebackq" %%a in ("File.txt") do ( echo "%%~a" )
Windows CMD reads file in both cases ("usebackq" uses to use quotes around filename). This error appears only when target file not found.
Case 6: ------- Using global ">" redirection after ()-body issue:
:: Will show ECHO text and create empty Test.bug if #==# ( echo Text 1... echo Text 2... )> "Test.bug" :: Will write Test.bug with echo text (normal case) if #==# ( echo Text 1...> "Test.bug" echo Text 2...> "Test.bug" )
Windows CMD does the same as second in both cases.
Case 7: ------- Incorrect IF() ELSE() processing if FOR() inside
:: Returns "ELSE is not an application" error: if #==# ( echo IF condition. for %%m in (*.txt) do ( echo FOR cycle. ) ) else ( echo ELSE condition. ) :: Works normally: if #==# ( echo IF condition. ) else ( echo ELSE condition. )
Also ELSE works normal when IF condition is NOT equal.
Case 8: ------- No processing file mask if it's quoted
:: Returns txt files that found: for %%f in (*.txt) do ( echo "%%~f" ) :: Returns nothing for %%f in ("*.txt") do (echo "%%~f") for %%f in ("Dir*.txt") do (echo "%%~f")
The same is if FOR with /R key is used.
For now that's all I found. Some of Wine 4.x bugs I knew seems to be fixed already.