cmd: Fix basic cmd.exe /c "echo hello" type syntax.
Add checks for existance of command to run in order to keep the new quote handling capabilities of cmd.exe /C or /K. If the command cannot be found, drop back to /S processing mode as per cmd.exe help.
This commit is contained in:
parent
b1dacc6c37
commit
88f14bb590
|
@ -1829,6 +1829,7 @@ 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.
|
rem to resync, as wine does not output anything in these cases yet.
|
||||||
echo --- Test 1
|
echo --- Test 1
|
||||||
cmd.exe /c echo Line1
|
cmd.exe /c echo Line1
|
||||||
|
cmd.exe /c echo "Line2"
|
||||||
echo --- Test 2
|
echo --- Test 2
|
||||||
cmd.exe /c echo Test quotes "&" work
|
cmd.exe /c echo Test quotes "&" work
|
||||||
echo --- Test 3
|
echo --- Test 3
|
||||||
|
|
|
@ -910,6 +910,7 @@ value1
|
||||||
------------ cmd.exe command lines ------------
|
------------ cmd.exe command lines ------------
|
||||||
--- Test 1
|
--- Test 1
|
||||||
Line1
|
Line1
|
||||||
|
@todo_wine@"Line2"
|
||||||
--- Test 2
|
--- Test 2
|
||||||
@todo_wine@Test quotes "&" work
|
@todo_wine@Test quotes "&" work
|
||||||
--- Test 3
|
--- Test 3
|
||||||
|
@ -929,11 +930,11 @@ Line1
|
||||||
--- Test 10
|
--- Test 10
|
||||||
--- Test 11
|
--- Test 11
|
||||||
--- Test 12
|
--- Test 12
|
||||||
@todo_wine@passed1
|
passed1
|
||||||
--- Test 13
|
--- Test 13
|
||||||
@todo_wine@passed2@space@
|
passed2@space@
|
||||||
--- Test 14
|
--- Test 14
|
||||||
@todo_wine@foobar
|
foobar
|
||||||
--- Test 15
|
--- Test 15
|
||||||
No prompts or I would not get here1
|
No prompts or I would not get here1
|
||||||
No prompts or I would not get here2
|
No prompts or I would not get here2
|
||||||
|
|
|
@ -2419,10 +2419,12 @@ int wmain (int argc, WCHAR *argvW[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If there is not exactly 2 quote characters, then /S (old behaviour) is enabled */
|
||||||
if (qcount!=2)
|
if (qcount!=2)
|
||||||
opt_s = TRUE;
|
opt_s = TRUE;
|
||||||
|
|
||||||
/* check argvW[0] for a space and invalid characters */
|
/* check argvW[0] for a space and invalid characters. There must not be any invalid
|
||||||
|
* characters, but there must be one or more whitespace */
|
||||||
if (!opt_s) {
|
if (!opt_s) {
|
||||||
opt_s = TRUE;
|
opt_s = TRUE;
|
||||||
p=*argvW;
|
p=*argvW;
|
||||||
|
@ -2432,7 +2434,7 @@ int wmain (int argc, WCHAR *argvW[])
|
||||||
opt_s = TRUE;
|
opt_s = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (*p==' ')
|
if (*p==' ' || *p=='\t')
|
||||||
opt_s = FALSE;
|
opt_s = FALSE;
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
@ -2507,6 +2509,71 @@ int wmain (int argc, WCHAR *argvW[])
|
||||||
|
|
||||||
WINE_TRACE("/c command line: '%s'\n", wine_dbgstr_w(cmd));
|
WINE_TRACE("/c command line: '%s'\n", wine_dbgstr_w(cmd));
|
||||||
|
|
||||||
|
/* Finally, we only stay in new mode IF the first parameter is quoted and
|
||||||
|
is a valid executable, ie must exist, otherwise drop back to old mode */
|
||||||
|
if (!opt_s) {
|
||||||
|
WCHAR *thisArg = WCMD_parameter(cmd, 0, NULL, NULL, FALSE);
|
||||||
|
static const WCHAR extEXEW[] = {'.','e','x','e','\0'};
|
||||||
|
static const WCHAR extCOMW[] = {'.','c','o','m','\0'};
|
||||||
|
BOOL found = FALSE;
|
||||||
|
|
||||||
|
/* If the supplied parameter has any directory information, look there */
|
||||||
|
WINE_TRACE("First parameter is '%s'\n", wine_dbgstr_w(thisArg));
|
||||||
|
if (strchrW(thisArg, '\\') != NULL) {
|
||||||
|
|
||||||
|
GetFullPathNameW(thisArg, sizeof(string)/sizeof(WCHAR), string, NULL);
|
||||||
|
WINE_TRACE("Full path name '%s'\n", wine_dbgstr_w(string));
|
||||||
|
p = string + strlenW(string);
|
||||||
|
|
||||||
|
/* Does file exist with this name? */
|
||||||
|
if (GetFileAttributesW(string) != INVALID_FILE_ATTRIBUTES) {
|
||||||
|
WINE_TRACE("Found file as '%s'\n", wine_dbgstr_w(string));
|
||||||
|
found = TRUE;
|
||||||
|
} else strcpyW(p, extEXEW);
|
||||||
|
|
||||||
|
/* Does file exist with .exe appended */
|
||||||
|
if (!found && GetFileAttributesW(string) != INVALID_FILE_ATTRIBUTES) {
|
||||||
|
WINE_TRACE("Found file as '%s'\n", wine_dbgstr_w(string));
|
||||||
|
found = TRUE;
|
||||||
|
} else strcpyW(p, extCOMW);
|
||||||
|
|
||||||
|
/* Does file exist with .com appended */
|
||||||
|
if (!found && GetFileAttributesW(string) != INVALID_FILE_ATTRIBUTES) {
|
||||||
|
WINE_TRACE("Found file as '%s'\n", wine_dbgstr_w(string));
|
||||||
|
found = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Otherwise we now need to look in the path to see if we can find it */
|
||||||
|
} else {
|
||||||
|
p = thisArg + strlenW(thisArg);
|
||||||
|
|
||||||
|
/* Does file exist with this name? */
|
||||||
|
if (SearchPathW(NULL, thisArg, NULL, sizeof(string)/sizeof(WCHAR), string, NULL) != 0) {
|
||||||
|
WINE_TRACE("Found on path as '%s'\n", wine_dbgstr_w(string));
|
||||||
|
found = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Does file exist plus an extension of .exe? */
|
||||||
|
if (SearchPathW(NULL, thisArg, extEXEW, sizeof(string)/sizeof(WCHAR), string, NULL) != 0) {
|
||||||
|
WINE_TRACE("Found on path as '%s'\n", wine_dbgstr_w(string));
|
||||||
|
found = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Does file exist plus an extension of .com? */
|
||||||
|
if (SearchPathW(NULL, thisArg, extCOMW, sizeof(string)/sizeof(WCHAR), string, NULL) != 0) {
|
||||||
|
WINE_TRACE("Found on path as '%s'\n", wine_dbgstr_w(string));
|
||||||
|
found = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If not found, drop back to old behaviour */
|
||||||
|
if (!found) {
|
||||||
|
WINE_TRACE("Binary not found, dropping back to old behaviour\n");
|
||||||
|
opt_s = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* strip first and last quote characters if opt_s; check for invalid
|
/* strip first and last quote characters if opt_s; check for invalid
|
||||||
* executable is done later */
|
* executable is done later */
|
||||||
if (opt_s && *cmd=='\"')
|
if (opt_s && *cmd=='\"')
|
||||||
|
|
Loading…
Reference in New Issue