2013-07-18 2 views
0

나는 너무 많은 (수백만 개)의 정리가 필요한 레코드 양식이있는 회사에서 일하고 있습니다.배치 스크립트 - 파일을 폴더에 추가 -

각 파일의 이름 지정 구조는 다음과 같습니다.
xxxxx-xx-xx-xxxxx43144-02-40-21324.<ext>

이전에는 파일을 같은 이름의 폴더에 넣는 배치 스크립트를 사용했지만 약간 다른 것을 찾고 있습니다.

나는 결국 다음과 같은 폴더 구조와 끝까지 싶습니다은 :
C:\[root directory]\43144\02\40\21324.PDF

이 가능한 같은가요? 배치 스크립트에 대한 지식이 현저하지 않으며 누구나 신속하게이 기능을 함께 사용할 수 있습니까? 사전에

감사합니다, 다윗이 바른 길에 당신을 설정해야합니다

+0

나는 이것이 가능하다는 것을 확신하지만, 옵션으로 가지고 있다면, vbs 나 심지어 콘솔 앱으로 무언가를 노크하면 더 쉽게 만들 수 있습니다. 또한 이름이 올바르지 않을 수도있는 파일을 처리하고 이름이 같은 파일을 처리 할 때 유연성을 제공합니다. – SmithMart

+0

답장을 보내 주셔서 감사합니다. 이 파일들은 모두이 명명 구조를 가지고 있으며 계속 진행되는 동안 그 파일들을 스캔하므로 정확하게 이름이 붙여 지지만 당신의 요점을 보게됩니다. 문제는 이런 종류의 지식이 존재하지 않는다는 것입니다. 그래서 나는 독자적으로 멀리 할 수 ​​없었습니다. 나는 필요한 것을 명확히하기 위해 OP를 편집했습니다. 감사! David – 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

멋진 코드 조각! –

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

파일 형식이 고정되는 경우, 우리는 다음과 같이 그것을 할 수 있습니다!

관련 문제