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

时间:2013-07-18 07:59:51

标签: windows batch-file cmd directory

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

每个文件使用以下命名结构:
xxxxx-xx-xx-xxxxx例如43144-02-40-21324.<ext>

我过去曾使用过将文件放入同名文件夹的批处理脚本,但我正在寻找稍微不同的东西。

我最终希望得到以下文件夹结构:
C:\[root directory]\43144\02\40\21324.PDF

这样的事情可能吗? 我对批处理脚本的了解是不存在的,有没有人能够快速将它们放在一起?

先谢谢大卫

4 个答案:

答案 0 :(得分:2)

@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 :(得分:1)

是的,这不是很难:

  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
    
  9. 这应该是它,或多或少(尽管我的实施中存在错误)。所以在这里再说一遍:

    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
    

答案 2 :(得分:0)

您必须使用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

答案 3 :(得分:0)

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

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