使用批处理文件

时间:2017-08-18 07:38:08

标签: batch-file

编码不是我的专长,但我遇到了一个问题,谷歌搜索引导我使用批处理文件过程来解决它。基本上我有几千个文件需要移动到文件夹中,它们有一个非常简单的文件结构,如下所示:

UK--London--Filename.pdf
UK--London--Filename2.pdf
UK--Manchester--Filename3.pdf
UK--Liverpool--Filename4.pdf
UK--Chester--Filename5.pdf 

我希望脚本能够:

1. Pick up the first "--" check if the folder exists, if not create it
2. Pick up the second "--" check if the folder exists, if not create it
3. As there might be more than two "--", ignore the rest
4. Move file into the subfolder

为此,输出应该是一些(注意“FILETEST”是我用来测试脚本的文件夹):

C:\FILETEST\UK\London\UK--London--Filename.pdf
C:\FILETEST\UK\London\UK--London--Filename2.pdf
C:\FILETEST\UK\Manchester\UK--Manchester--Filename3.pdf
C:\FILETEST\UK\Liverpool\UK--Liverpool--Filename4.pdf
C:\FILETEST\UK\Chester\UK--Chester--Filename5.pdf

我尝试在stackoverflow(Batch create folders based on part of file name and move files into that folder)中重新使用另一个问题的脚本。我明白它不会完全符合我的需要,但似乎无法获得任何输出。

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

对任何令人头疼的问题道歉,我希望这是一个简单的解决方案。

谢谢,

帕诺斯

1 个答案:

答案 0 :(得分:1)

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

读取当前目录中的文件目录列表,(/a-d =无目录名)与*--*--*匹配。标记,以便%%a获取第一个- - 序列之前的部分,%%b第二个和%%c剩余部分。

如果%%c不是为空,那么请创建目录"。\ %% a"和"。\ %% a \ %% b" (引用,因为名称中的任何空格都将被视为"创建两个目录")然后移动文件,再次引用同样的原因。

请注意,delims=和close-quote之间的每个字符都是分隔符 - 不支持分隔符字符串。因此,此代码将选择-以及----的任何其他序列并尝试处理它。您可以在if exist "%%a--%%b--%%c"之前的if "%%c" neq ""之后直接添加(来进一步关闭创建/移动。

如果目标名称尚不存在,md将创建一个目录,如果已存在,则生成错误消息。要取消显示错误消息,请将2>nul附加到md行。