【问题标题】:Batch script - files to folders - with addition批处理脚本 - 文件到文件夹 - 添加
【发布时间】:2013-07-18 07:59:50
【问题描述】:

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

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

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

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

这样的事情可能吗? 我对批处理脚本的知识不存在,有没有人有能力快速把它放在一起?

提前致谢,大卫

【问题讨论】:

  • 我完全确定这是可能的,但是,如果你有它作为一个选项,在 vbs 甚至 c# 控制台应用程序中敲一些东西可以使它更容易。此外,它可以让您更灵活地处理可能命名不正确的文件,以及处理可能具有相同名称的文件。
  • 感谢您的及时回复。这些文件都带有这种命名结构,我正在扫描它们,所以它们的命名是正确的,但我确实明白你的意思。问题是我对这类事情的了解是不存在的,所以我自己不能走得太远,我已经编辑了我的 OP 以澄清我需要什么。谢谢!大卫

标签: windows batch-file cmd directory


【解决方案1】:
@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

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

【讨论】:

  • 完美运行。非常感谢!
  • 一个额外的查询,如果我想在它被移动时获得完整的文件名怎么办,所以结构就像 C:[root directory]\43144\02\40\43144-02 -40-21324.PDF 我看过代码,但无法弄清楚。谢谢! - 大卫
  • 两种不同的方式。您可以删除move 语句的目标中的%%d,这意味着目标将以` (if you ignore the rabbit's ears) and hence be a DIRECTORY - since the FILEname isn't specified, the source FILEname would be used. OR you could replace that %%d` 和%%a-%%b-%%c-%%d 结尾 - 与构建源文件名的方式相同。
【解决方案2】:

是的,这并不难:

  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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      @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!
      )
      

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

      【讨论】:

        猜你喜欢
        • 2020-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-19
        • 2019-02-10
        • 1970-01-01
        相关资源
        最近更新 更多