我在一家拥有太多(数百万)需要组织的记录表格的公司工作。
每个文件使用以下命名结构:
xxxxx-xx-xx-xxxxx
例如43144-02-40-21324.<ext>
我过去使用过一个将文件放入同名文件夹的批处理脚本,但我正在寻找稍微不同的东西。
我最终希望得到以下文件夹结构:
C:\[root directory]\43144\02\40\21324.PDF
这样的事情可能吗?我对批处理脚本的了解不存在,有没有人有能力快速把它放在一起?
在此先感谢,大卫
我在一家拥有太多(数百万)需要组织的记录表格的公司工作。
每个文件使用以下命名结构:
xxxxx-xx-xx-xxxxx
例如43144-02-40-21324.<ext>
我过去使用过一个将文件放入同名文件夹的批处理脚本,但我正在寻找稍微不同的东西。
我最终希望得到以下文件夹结构:
C:\[root directory]\43144\02\40\21324.PDF
这样的事情可能吗?我对批处理脚本的了解不存在,有没有人有能力快速把它放在一起?
在此先感谢,大卫
@ECHO OFF
SETLOCAL
SET "sourcedir=."
SET "destdir=u:\temp"
FOR /f "tokens=1,2,3,*delims=-" %%a IN ('dir /b/a-d "%sourcedir%\*-*-*-*"') DO (
MD "%destdir%\%%a\%%b\%%c" 2>NUL
IF EXIST "%destdir%\%%a\%%b\%%c\%%d" (ECHO "%destdir%\%%a\%%b\%%c\%%d" already exists
) ELSE (
MOVE "%sourcedir%\%%a-%%b-%%c-%%d" "%destdir%\%%a\%%b\%%c\%%d" >nul
)
)
GOTO :EOF
这应该让您走上正确的轨道 - 只需要设置您的源目录和目标目录......
是的,这并不难做到:
我们需要遍历所有文件
for %%F in (*.ext) ...
为简单起见,我们在当前文件夹中查找,因此请事先进行适当的设置。但是你也可以提供一个文件夹来查看。
对于找到的每个文件,只需调用一个完成工作的子程序
... do call :process "%%~F"
退出主方法
goto :eof
我们现在需要一个子程序
rem :process <filename>
:process
将文件名分解成各个部分。由于这些都是固定长度的,我们可以在这里使用子字符串。
set "Filename=%~1"
set "Part1=%Filename:~0,5%"
set "Part2=%Filename:~6,2%"
set "Part3=%Filename:~9,2%"
set "Rest=%Filename:~12%"
现在我们可能应该检查我们需要将其复制到的文件夹是否已经存在
if not exist C:\root\%Part1%\%Part2%\%Part3%\NUL mkdir C:\root\%Part1%\%Part2%\%Part3%
如有必要,这将沿途创建每个文件夹。非常便利。
立即重命名并移动文件
move %1 C:\root\%Part1%\%Part2%\%Part3%\%Rest%
退出子程序
goto :eof
或多或少应该是这样(尽管我的实现中存在错误)。所以这里再次完整:
for %%F in (*.ext) do call :process "%%~F"
goto :eof
rem :process <filename>
:process
set "Filename=%~1"
set "Part1=%Filename:~0,5%"
set "Part2=%Filename:~6,2%"
set "Part3=%Filename:~9,2%"
set "Rest=%Filename:~12%"
if not exist C:\root\%Part1%\%Part2%\%Part3%\NUL mkdir C:\root\%Part1%\%Part2%\%Part3%
move %1 C:\root\%Part1%\%Part2%\%Part3%\%Rest%
goto :eof
@Echo off
SET extension=%1
setlocal enabledelayedexpansion
for %%f in ("*.%extension%") do (
SET substr=%%f
echo !substr!
copy !substr! !substr:~0,5!\!substr:~6,2!\!substr:~9,2!\!substr:~12,5!.%extension%
del !substr!
)
如果文件格式是固定的,我们可以这样做!
您将不得不遍历文件并使用FOR
. 然后,您必须确保创建目录并将文件复制/移动到新路径。
For %%f In (*.*) Do For /F "Tokens=1,2,3,4,5,6 Delims=-" %%i In ("%%f") Do Call :PutInPath %%f %%i %%j %%k %%k %%l
GoTo :EOF
:PutInPath
MD "C:\your dir\%2"
MD "C:\your dir\%2\%3"
MD "C:\your dir\%2\%3\%4"
REM You can use COPY, MOVE, REN, ...
COPY %1 "C:\your dir\%2\%3\%4\%5"
GoTo :EOF