使用DOS批处理将所有文件移动到1个目录


4

我已经创建了一个批处理文件,通过Win7中的右键菜单执行。当我右键单击一个文件夹时,我希望批处理文件将所有文件(不包括文件夹)移到1个目录中。到目前为止我有这个:

PUSHHD %1
MOVE "%1\*.*"  ..\

只要我从中移动文件的文件夹没有任何空格,这似乎就可以工作。当文件夹有空格时,我收到一条错误消息:“命令的语法不正确。”

所以我的批处理工作在标题为PULLTEST但不在标题文件夹上的文件夹上PULL TEST

同样,我不需要它来移动文件夹,只需要移动文件。我希望它可以在任何驱动器上的任何目录中工作。我将不会有任何特定的目录。它将是随机的。


下面是我提供的注册表文件,如果需要参考。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\PullFiles]
@="PullFilesUP"

[HKEY_CLASSES_ROOT\Directory\shell\PullFiles\command]
@="\"C:\\Program Files\\MyBatchs\\PullFiles.bat\" \"%1\""

每当有人将Windows命令行界面称为“DOS”时,一只小猫就会死...
一个CVn 2014年

Answers:


2

批次可以像这一个班轮一样简单:

@move "%~1\*" "%~1\.."

代字号删除参数值中可能已存在的任何封闭引号。额外的报价是您问题的根源。

编辑 - 如果父目录中已存在同名文件,则不说明要发生什么。由于MOVE命令位于批处理文件中,因此默认情况下会自动覆盖父文件夹中的文件。如果您希望脚本提示指令,让您有机会阻止覆盖,那么您需要该/-Y选项。

@move /-y "%~1\*" "%~1\.."

这不也会移动文件夹吗?all files (excluding folders)。但是,OP的版本(*.*)也不能防止这种情况发生,因为文件夹名称可以包含点
nixda 2014年

1
@nixda - 如果明确列出,MOVE将仅移动文件夹。如果使用通配符,它​​将永远不会移动文件夹。此外,*.*匹配任何文件,包括没有扩展名的文件(无点)。
dbenham 2014年

啊,很高兴知道
nixda 2014年

1

你拼错了pushd命令,你有两个h

你必须%1move命令中删除。如果目录有空格,move命令将被破坏。

假设您的批次已命名MoveFiles.bat。它被称为这样:

MoveFiles.bat "C:\Test\With Spaces"

批处理中的参数替换后,它看起来像这样:

PUSHD "C:\Test\With Spaces"
MOVE ""C:\Test\With Spaces"*.*" ..\

由于嵌套引号,第二个命令有语法错误。


这个版本的批处理对我有用:

PUSHD %1
MOVE *.* ..\

1
+1嵌套引号不是语法错误,但它是问题的根源。例如,使用一组额外的引号""%1\*.*""可以工作,但不建议这样做。
dbenham 2014年

@dbenham当然可以!行情被错误地嵌套:)
Alexey Ivanov 2014年

-1

抛出错误的原因是因为空间。pushd适用于空格,但move不适用。尝试..\用引号括起你的第二个参数:

PUSHD %1
MOVE "%1*.*" "..\"

1
添加引号在..\ 这里没有帮助,因为错误是由第一个参数中的双引号引起的,move因为%1已经有引号。
阿列克谢伊万诺夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.