cmd.exe: Support rd dir1 dir2.
This commit is contained in:
parent
cc3dd00c04
commit
0efa91de15
|
@ -36,6 +36,9 @@
|
|||
|
||||
#include "wcmd.h"
|
||||
#include <shellapi.h>
|
||||
#include "wine/debug.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(cmd);
|
||||
|
||||
void WCMD_execute (char *orig_command, char *parameter, char *substitution);
|
||||
|
||||
|
@ -752,44 +755,59 @@ void WCMD_pause (void) {
|
|||
* Delete a directory.
|
||||
*/
|
||||
|
||||
void WCMD_remove_dir (void) {
|
||||
void WCMD_remove_dir (char *command) {
|
||||
|
||||
if (param1[0] == 0x00) {
|
||||
int argno = 0;
|
||||
int argsProcessed = 0;
|
||||
char *argN = command;
|
||||
|
||||
/* Loop through all args */
|
||||
while (argN) {
|
||||
char *thisArg = WCMD_parameter (command, argno++, &argN);
|
||||
if (argN && argN[0] != '/') {
|
||||
WINE_TRACE("rd: Processing arg %s (quals:%s)\n", thisArg, quals);
|
||||
argsProcessed++;
|
||||
|
||||
/* If subdirectory search not supplied, just try to remove
|
||||
and report error if it fails (eg if it contains a file) */
|
||||
if (strstr (quals, "/S") == NULL) {
|
||||
if (!RemoveDirectory (thisArg)) WCMD_print_error ();
|
||||
|
||||
/* Otherwise use ShFileOp to recursively remove a directory */
|
||||
} else {
|
||||
|
||||
SHFILEOPSTRUCT lpDir;
|
||||
|
||||
/* Ask first */
|
||||
if (strstr (quals, "/Q") == NULL) {
|
||||
BOOL ok;
|
||||
char question[MAXSTRING];
|
||||
|
||||
/* Ask for confirmation */
|
||||
sprintf(question, "%s, ", thisArg);
|
||||
ok = WCMD_ask_confirm(question, TRUE);
|
||||
|
||||
/* Abort if answer is 'N' */
|
||||
if (!ok) return;
|
||||
}
|
||||
|
||||
/* Do the delete */
|
||||
lpDir.hwnd = NULL;
|
||||
lpDir.pTo = NULL;
|
||||
lpDir.pFrom = thisArg;
|
||||
lpDir.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI;
|
||||
lpDir.wFunc = FO_DELETE;
|
||||
if (SHFileOperationA(&lpDir)) WCMD_print_error ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle no valid args */
|
||||
if (argsProcessed == 0) {
|
||||
WCMD_output ("Argument missing\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* If subdirectory search not supplied, just try to remove
|
||||
and report error if it fails (eg if it contains a file) */
|
||||
if (strstr (quals, "/S") == NULL) {
|
||||
if (!RemoveDirectory (param1)) WCMD_print_error ();
|
||||
|
||||
/* Otherwise use ShFileOp to recursively remove a directory */
|
||||
} else {
|
||||
|
||||
SHFILEOPSTRUCT lpDir;
|
||||
|
||||
/* Ask first */
|
||||
if (strstr (quals, "/Q") == NULL) {
|
||||
BOOL ok;
|
||||
char question[MAXSTRING];
|
||||
|
||||
/* Ask for confirmation */
|
||||
sprintf(question, "%s, ", param1);
|
||||
ok = WCMD_ask_confirm(question, TRUE);
|
||||
|
||||
/* Abort if answer is 'N' */
|
||||
if (!ok) return;
|
||||
}
|
||||
|
||||
/* Do the delete */
|
||||
lpDir.hwnd = NULL;
|
||||
lpDir.pTo = NULL;
|
||||
lpDir.pFrom = param1;
|
||||
lpDir.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI;
|
||||
lpDir.wFunc = FO_DELETE;
|
||||
if (SHFileOperationA(&lpDir)) WCMD_print_error ();
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
|
|
@ -55,7 +55,7 @@ void WCMD_print_error (void);
|
|||
void WCMD_process_command (char *command);
|
||||
void WCMD_pushd (void);
|
||||
int WCMD_read_console (char *string, int str_len);
|
||||
void WCMD_remove_dir (void);
|
||||
void WCMD_remove_dir (char *command);
|
||||
void WCMD_rename (void);
|
||||
void WCMD_run_program (char *command, int called);
|
||||
void WCMD_setlocal (const char *command);
|
||||
|
|
|
@ -530,7 +530,7 @@ void WCMD_process_command (char *command)
|
|||
break;
|
||||
case WCMD_RD:
|
||||
case WCMD_RMDIR:
|
||||
WCMD_remove_dir ();
|
||||
WCMD_remove_dir (p);
|
||||
break;
|
||||
case WCMD_SETLOCAL:
|
||||
WCMD_setlocal(p);
|
||||
|
|
Loading…
Reference in New Issue