diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index cb4a7b901c4..25d5be145e8 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -2861,7 +2861,14 @@ void WCMD_if (WCHAR *p, CMD_LIST **cmdList) } else if (!lstrcmpiW (condition, existW)) { WIN32_FIND_DATAW fd; - HANDLE hff = FindFirstFileW(WCMD_parameter(p, 1+negate, NULL, FALSE, FALSE), &fd); + HANDLE hff; + WCHAR *param = WCMD_parameter(p, 1+negate, NULL, FALSE, FALSE); + int len = strlenW(param); + + /* FindFirstFile does not like a directory path ending in '\', append a '.' */ + if (len && param[len-1] == '\\') strcatW(param, dotW); + + hff = FindFirstFileW(param, &fd); test = (hff != INVALID_HANDLE_VALUE ); if (test) FindClose(hff); diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index 0e88ad14fa5..b36afa42290 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -1046,6 +1046,26 @@ if exist idontexist\ba* ( ) else ( echo exist wildcard bad subdir broken works ) +if exist subdir ( + echo exist subdir ok +) else ( + echo ERROR exist subdir not working +) +if exist subdir\. ( + echo exist subdir with . ok +) else ( + echo ERROR exist subdir with . not working +) +if exist subdir\ ( + echo exist subdir with \ ok +) else ( + echo ERROR exist subdir with \ not working +) +if exist "subdir\" ( + echo exist subdir with \ and quotes ok +) else ( + echo ERROR exist subdir with \ and quotes not working +) del foo subdir\bar rd subdir diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 1f2b5dd8dee..764e4546fb1 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -783,6 +783,10 @@ exist simple wildcard works exist wildcard works negate exist wildcard works exist wildcard bad subdir broken works +exist subdir ok +exist subdir with . ok +exist subdir with \ ok +exist subdir with \ and quotes ok ------ for numbers negative numbers handled negative numbers handled