我正在运行以下批处理脚本将文件移动到其相应的文件夹中:
@echo off
for %%a in (*.*) do (
move "%%a" "%%~na"
)
pause
对于没有同名文件夹的文件,它会删除它们的扩展名。如何修改批处理脚本,以便其余文件保留其扩展名?
答案1
您可能已经意识到,问题在于该命令
move "%%a" "%%~na"
其扩展为(例如)move "SCHEDULE.XLSX" "SCHEDULE"
,其目的是将文件移动SCHEDULE.XLSX
到名为的文件夹中SCHEDULE
,只需重命名 SCHEDULE.XLSX
SCHEDULE
如果文件夹不存在,则执行此 操作。一个简单的解决方案是
@echo off
for %%A in (*.*) do (
if exist "%%~nA"\ move /-y "%%A" "%%~nA"
)
- 根据建议马尔,在尝试将文件移动到目标之前,测试目标是否存在。
- 测试目标是否目录存在——即测试目标是否存在并且是一个目录— 通过测试
"%%~nA"\
(末尾带有反斜杠,表示目录)而不是简单的"%%~nA"
。这可以防止我们FOO
通过移动FOO.BAR
到现有文件来破坏该文件。 move /-y
指定move
在破坏现有文件之前应要求确认。您可能认为测试if exist
涵盖了这一点,但它没有处理目录调用FOO
和文件调用FOO.BAR
的情况两个都在当前目录和 中FOO
。如果您总是想覆盖目录中的现有文件,只需省略/-y
。如果您永远不想覆盖现有文件(并且您不想被要求确认),请执行如果存在“%%~nA”\如果不存在“%%~nA”\“%%~nxA”移动“%%A”“%%~nA”
- 更改
%%a
为%%A
基本上是一种风格/偏好更改(但请注意,它并非纯粹是外观上的——与环境变量不同,循环索引区分大小写——如果更改为%%a
,%%A
则必须在每次出现时都执行此操作)。由于%~
修饰符可以聚合——例如,%~pnxA
相当于%~pA%~nA%~xA
(路径、名称和扩展名%A
)——如果循环索引大写,则更容易阅读。作为一个极端的例子,在对于 %x 在 (。) 做(某物)%~xx
%~xx
的扩展 并不明显%x
。
答案2
可能是像这样简单的事情:
@echo off
set "dir=C:\Your\Directory"
for /r "%dir%" %%a in (*) do (
if exist "%dir%\%%~na" move "%%a" "%dir%\%%~na"
)
pause
for /r
查看我们分配给变量的目录路径中的所有文件%dir%
,并将每个文件分配给参数%%a
;对于每次迭代,如果有一个%dir%\%%~na
与文件 () 同名的子文件夹 ( %%~na
),则将该文件移动到该子文件夹中。它将跳过没有匹配子文件夹的文件。如果需要更复杂,我们可以实现它,但通常这可能是您想要的。