批处理脚本成功移动文件,但剩余文件丢失其扩展名

批处理脚本成功移动文件,但剩余文件丢失其扩展名

我正在运行以下批处理脚本将文件移动到其相应的文件夹中:

@echo off
for %%a in (*.*) do (
move "%%a" "%%~na"
)
pause

对于没有同名文件夹的文件,它会删除它们的扩展名。如何修改批处理脚本,以便其余文件保留其扩展名?

答案1

您可能已经意识到,问题在于该命令

move "%%a" "%%~na"

其扩展为(例如)move "SCHEDULE.XLSX" "SCHEDULE",其目的是将文件移动SCHEDULE.XLSX 到名为的文件夹中SCHEDULE,只需重命名 SCHEDULE.XLSXSCHEDULE如果文件夹不存在,则执行此 操作。一个简单的解决方案是

@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),则将该文件移动到该子文件夹中。它将跳过没有匹配子文件夹的文件。如果需要更复杂,我们可以实现它,但通常这可能是您想要的。

相关内容