diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index ec0ece4590a..7ebe57a076f 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -18,25 +18,25 @@ at-echoed-word @pwd@>echo "/?"@space@ "/?" -@todo_wine@@pwd@>echo. +@pwd@>echo. @pwd@>echo .@space@ . -@todo_wine@@pwd@>echo.word +@pwd@>echo.word word @pwd@>echo .word@space@ .word -@todo_wine@@pwd@>echo: +@pwd@>echo: @pwd@>echo :@space@ : -@todo_wine@@pwd@>echo:word +@pwd@>echo:word word @pwd@>echo :word@space@ diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 5dbf74cfd32..0111c15ab28 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1786,10 +1786,22 @@ WCHAR *WCMD_ReadAndParseLine(WCHAR *optionalcmd, CMD_LIST **output, HANDLE readF /* Show prompt before batch line IF echo is on and in batch program */ if (context && echo_mode && extraSpace[0] && (extraSpace[0] != '@')) { const WCHAR spc[]={' ','\0'}; + const WCHAR echoDot[] = {'e','c','h','o','.'}; + const WCHAR echoCol[] = {'e','c','h','o',':'}; + const DWORD len = sizeof(echoDot)/sizeof(echoDot[0]); + DWORD curr_size = strlenW(extraSpace); + DWORD min_len = (curr_size < len ? curr_size : len); WCMD_show_prompt(); WCMD_output_asis(extraSpace); /* I don't know why Windows puts a space here but it does */ - WCMD_output_asis(spc); + /* Except for lines starting with 'echo.' or 'echo:'. Ask MS why */ + if (CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, + extraSpace, min_len, echoDot, len) != CSTR_EQUAL + && CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, + extraSpace, min_len, echoCol, len) != CSTR_EQUAL) + { + WCMD_output_asis(spc); + } WCMD_output_asis(newline); }