如何批处理文件以从文件名的一部分创建文件夹并移动文件

时间:2014-10-31 22:18:03

标签: batch-file

批处理文件,用于从文件名的一部分创建文件夹并移动文件。

我有很多文件需要在他们自己的子文件夹中。

他们采用以下格式: 实施例

123456-ABC-XYZ
123456-DFG-XYZ
123456-HIJ-XYZ

我想在哪里创建一个子文件夹,然后用8-10字符移动文件 或者通过12-14

将此作为我在Magoo发布的网站上找到的基础 它可以通过第一组字符(h:\ 1AAATEST =我的测试文件夹

)来完成
@ECHO OFF
SETLOCAL
SET "sourcedir=h:\1AAATEST"
PUSHD %sourcedir%
FOR /f "tokens=1*" %%a IN (
 'dir /b /a-d "*_*_*-*-* *.*"'
DO
(MD %%b MOVE "%%a %%b" .\%%b\)
POPD
GOTO :EOF

[编辑Magoo的说明:

这是不正确的。这是我发布的内容:

@ECHO OFF
SETLOCAL
SET "sourcedir=c:\sourcedir"
PUSHD %sourcedir%
FOR /f "tokens=1*" %%a IN (
 'dir /b /a-d "*_*_*-*-* *.*"'
 ) DO (  
 ECHO MD %%a
 ECHO MOVE "%%a %%b" .\%%a\
)
POPD
GOTO :EOF

参考:Question from nearly a year ago

请注意,除了源目录的更改和echo关键字的省略之外,还存在重大差异。 OP在这个问题中的语法只是不起作用。

我使用与原始

相同的结果对其进行了修改
@ECHO OFF
SETLOCAL
SET "sourcedir=h:\1AAATEST"
PUSHD %sourcedir%
FOR /f "tokens=1*" %%a IN (
 'dir /b /a-d "*-*-*.*"'
 ) DO (  
 MD %%a
MOVE "%%a %%b" .\%%a\
)
POPD
GOTO :EOF

然后再次,它从这个文件名

创建了4个文件夹
LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1

但是没有移动任何文件。

1st folder = -
2nd = 11-18-10_1
3rd = Diagnostic
4th = Topography



@ECHO OFF
SETLOCAL
SET "sourcedir=h:\1AAATEST"
PUSHD %sourcedir%
FOR /f "tokens=1*" %%a IN (
 'dir /b /a-d "*-*-*.*"'
) DO (  
 MD %%b
 MOVE "%%a %%b" .\%%a\
)
POPD
GOTO :EOF

我想出了以下内容:

@echo off
for /f "tokens=1-3* delims=-," %%a in ('dir /b /a-d "*-*-*"') do (
(md "%%~nb" 2>nul)
(MOVE "%%a-%%b-%%c" "%%b"))
POPD
GOTO :EOF

它适用于为文件名的第1和第2部分制作目录和移动文件, 通过将md更改为&移动目标dir为文件名的第1部分& 通过将md改为b&将目标dir移动到b为文件名的第二部分&

但是将md更改为c&移动目标dir到c为文件名的第3部分& DOESN" T 工作。它创建了正确的目录,并且它不会移动文件,但会将文件范围缩短为XYZ。

建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

有一天,我收到了一个使用我发布的图书馆的人的愤怒电话,这是一个重大错误。实际上,它已被某人修改和重新发布,但没有注明图书馆来源中的人,时间或原因。这是我最后一次为我的商业作品发布源代码。

您遇到的问题非常简单。

for /f审核LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1并将LAST_FIRST_7-24-1936分配给%%aDiagnostic - Topography 11-18-10_1分配给%%b

在您修改它的代码中,您正在执行MD %%b,这将被解释为

MD Diagnostic - Topography 11-18-10_1

所以批处理会根据要求创建这四个目录。

然后遇到move。目标目录为.\%%a\,它将尝试将文件移动到.\LAST_FIRST_7-24-1936\ - 一个不太可能存在的目录。

所以 - 要解决此问题,请尝试将MD %%b替换为原始代码中指定的MD %%a

至于您对123456-ABC-XYZ的要求,请尝试

@ECHO OFF
SETLOCAL
SET "sourcedir=h:\1AAATEST"
PUSHD %sourcedir%
FOR /f "tokens=1,2,*" %%a IN (
 'dir /b /a-d "*-*-*"'
) DO (  
 MD %%b
 MOVE "%%a-%%b-%%c" .\%%b\
)
POPD
GOTO :EOF

(此版本移动到包含中间字符块的目录 - 移动到结束块,在%%b命令和目标中用%%c替换MD move命令)

BTW - md很可能会抱怨尝试创建现有目录。您可以通过将2>nul附加到md命令的末尾来关闭它。