2013-07-18 78 views
0

我正在一家公司工作,有太多(百萬)的記錄表單需要組織。批處理腳本 - 文件到文件夾 - 另外

每個文件使用以下命名結構:
xxxxx-xx-xx-xxxxx例如, 43144-02-40-21324.<ext>

我已經在過去使用了一個批處理腳本,將文件放入同名的文件夾中,但我正在尋找稍有不同的東西。

我最終想用下面的文件夾結構,以結束:
C:\[root directory]\43144\02\40\21324.PDF

是這樣的可能嗎? 我的批處理腳本的知識是不存在的,有沒有人有能力迅速將它們扔在一起?

由於提前,大衛

+0

我完全相信這是可能的,但是,如果您將它作爲選項,在vbs或c#控制檯應用程序中敲入某些內容可以使其更容易。另外,它可以更靈活地處理可能沒有正確命名的文件,並處理可能具有相同名稱的文件。 – SmithMart

+0

感謝您的及時回覆。這些文件都帶有這種命名結構,並且在進行掃描時會對它們進行掃描,因此它們的命名是正確的,但我確實看到了你的觀點。問題是,我對這類事情的知識並不存在,所以我不能獨自走得很遠,我已經編輯了我的OP,以澄清我需要的東西。謝謝!大衛 – David

回答

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 

這應該設置你在正確的軌道上 - 只需要設置你的源和目標目錄...

+0

好的一段代碼!從'SET'中刪除''' –

+0

完美地工作,非常感謝! – David

+0

另外一個查詢,如果我想在移動完整的文件名時該怎麼辦,所以結構會像C:\ [根目錄] \ 43144 \ 02 \ 40 \ 43144-02-40-21324.PDF我已經看了一下代碼,但無法弄清楚,謝謝! - David – David

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 
1

是的,這是不是很難做到的:

  1. 我們需要循環中的所有文件

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

    對於我們在當前文件夾看起來簡單的原因,所以事先進行適當的設置。但你也可以提供一個文件夾中查找。

  2. 對於找到的每一個文件,只需要調用一個子程序做的工作

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

    goto :eof 
    
  4. 我們現在需要子程序

    rem :process <filename> 
    :process 
    
  5. Dis將文件名分割成它的部分。由於這些都是固定長度的,我們可以在這裏使用子字符串。

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

如果文件格式是固定的,我們能做到這個樣子!

相關問題