编码不是我的专长,但我遇到了一个问题,谷歌搜索引导我使用批处理文件过程来解决它。基本上我有几千个文件需要移动到文件夹中,它们有一个非常简单的文件结构,如下所示:
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
对任何令人头疼的问题道歉,我希望这是一个简单的解决方案。
谢谢,
帕诺斯
答案 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
行。