批处理脚本将文件夹中的每个文件移动到以文件命名的自己的文件夹中?

时间:2014-06-12 20:32:44

标签: file batch-file directory

所以,如果我有

/folder/file1.txt
/folder/file2.jpg
/folder/file3.py

我想创建

/folder/file1/file1.txt
/folder/file2/file2.jpg
/folder/file3/file3.py

我有这个批处理文件(在运行它时要小心),这大部分都有效,但如果文件名中有空格,则文件夹名称只会在空格中被命名,因此文件不会被移动在里面。

另外,我只是通过在文件夹名称的末尾随意添加“文件夹”或一些随机字符串来工作,如果我排除它,由于某种原因它将无法工作。我在Windows 7上。

@echo off

for /f %%a in ('dir /a-d /b') do (
  if not "%%~dpnxa"=="%~dpnx0" call :func "%%~a"
)

goto :EOF

:func
set file=%~1
set dir=%file% Folder
md "%dir%" Folder 2>nul
move "%file%" "%dir%" 
goto :EOF

有关如何解决空白/名称问题的任何想法?提前谢谢。

2 个答案:

答案 0 :(得分:2)

@echo off

for /f "usebackq delims=?" %%a in (`dir /a-d /b`) do (
  if not "%%~dpnxa"=="%~dpnx0" call :func "%%~a"
)

goto :EOF

:func
set file=%~1
set dir=%file% Folder
md "%dir%" Folder 2>nul
move "%file%" "%dir%" 
goto :EOF

通过设置delims =?你是说你的分隔符是?分割一个字符串,而不是空白字符,它允许您读取包含空格的完整文件名。 Usebackq意味着您改为使用`围绕要运行的命令,这对我来说,只是使阅读和理解更合乎逻辑“嘿,我实际上正在执行此字符串。”

答案 1 :(得分:1)

为避免路径/文件名中的空格出现问题,请双引号引用它们。

必须在代码中的文件夹末尾包含字符串的原因是您正在尝试创建一个与文件名称完全相同的文件夹(在您的代码中,您没有删除扩展名),以及您不能在具有相同名称的文件夹中包含两个元素(文件或文件夹)。

@echo off
    for %%a in ("c:\folder\*") do (
        if not "%%~fa"=="%~f0" (
            if not exist "%%~dpna\" echo md "%%~dpna" 
            if     exist "%%~dpna\" echo move /y "%%~fa" "%%~dpna"
        )
    )

对于指定文件夹中的每个文件

  • 如果文件不是批处理文件

    • 如果不存在与文件同名的文件夹,则创建它
    • 如果目标文件夹存在,请将文件移至文件夹

%%~fa =正在处理的文件的完整路径

%~f0 =批处理文件的完整路径

%%~dpna =没有扩展当前文件的驱动器,路径和文件名

在此代码中,第三个if的原因是检查可能的先前文件夹创建是否失败。如果你有一个没有扩展名的文件,你将无法创建该文件夹,因为它将与文件具有完全相同的名称,这是不允许的。

代码包括echomd之前的move个命令,以显示将要执行的内容。如果输出正确,请删除echo以使其正常工作。