繁体   English   中英

批处理脚本-文件到文件夹-附加

[英]Batch script - files to folders - with addition

我在一家拥有太多(数百万)记录表格且都需要组织的公司工作。

每个文件使用以下命名结构:
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

这应该使您走上正确的道路-只需设置源目录和目标目录...

是的,这并不是很难做到的:

  1. 我们需要遍历所有文件

     for %%F in (*.ext) ... 

    为简单起见,我们在当前文件夹中查找,因此请事先进行适当设置。 但是您也可以提供一个文件夹来查找。

  2. 对于找到的每个文件,只需调用一个完成工作的子例程

     ... do call :process "%%~F" 
  3. 退出主要方法

     goto :eof 
  4. 我们现在需要一个子程序

     rem :process <filename> :process 
  5. 将文件名分解成几个部分。 由于这些都是固定长度的,因此我们可以在这里使用子字符串。

     set "Filename=%~1" set "Part1=%Filename:~0,5%" set "Part2=%Filename:~6,2%" set "Part3=%Filename:~9,2%" set "Rest=%Filename:~12%" 
  6. 现在我们应该检查我们需要复制到该文件夹​​的文件夹是否已经存在

     if not exist C:\\root\\%Part1%\\%Part2%\\%Part3%\\NUL mkdir C:\\root\\%Part1%\\%Part2%\\%Part3% 

    如有必要,这将在创建过程中创建每个文件夹。 非常便利。

  7. 现在重命名并移动文件

     move %1 C:\\root\\%Part1%\\%Part2%\\%Part3%\\%Rest% 
  8. 退出子程序

     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为每个文件拆分名称进行遍历。 然后,您必须确保已创建目录并将文件复制/移动到新路径。

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
@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!
)

如果文件格式是固定的,我们可以这样做!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM