2013-07-18 2 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 – 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: \ [ root directory] \ 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! 
) 

если формат файла фиксированы, мы можем сделать это так!

Смежные вопросы