2017-01-23 12 views
-2

Найден решение pyhton here, но мне нужно пакетное решение на основе файлов.Пакетный файл для перемещения файлов на основе части имени файла, в папку на основе части имени папки

Есть много файлов:

  • SSP4325_blah-бла-blah.xml
  • JKP7645_blah.xml
  • YTG6457-бла-blah.xml

и имена папок которые содержат фрагмент файла:

  • RefID - SSP4325, JKP7645, GHT1278, YRR0023
  • RefID - YTG6457

Я ищу пакетного решения, которое будет гласить часть имени файла на передней панели (перед первым тире или подчеркиванием), а затем переместите этот файл в папку, в которой перед именем файла существует имя папки.

Таким образом, в приведенных выше примерах первые два файла (SSP4325 и JKP7645) были перемещены в первую папку, поскольку в нем содержался этот текст как часть имени папки.

Третий файл будет перенесен во вторую папку.

У меня есть сотни файлов и 63 папки. Поэтому я надеюсь, что смогу автоматизировать.

Нельзя использовать Powershell или Python из-за ограничений окружающей среды. Так что надеюсь на пакетный подход.

Спасибо. Шон.

ответ

0
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\*.xml" ' 
) DO (
FOR /f "tokens=1delims=_-" %%b IN ("%%a") DO (
    FOR /f "delims=" %%d IN (
    'dir /b /ad "%destdir%\*%%b*" ' 
) DO (
    ECHO(MOVE "%%a" "%destdir%\%%d\" 
) 
) 
) 

GOTO :EOF 

Вам потребуется изменить настройки sourcedir и destdir в соответствии с вашими обстоятельствами.

Необходимые команды MOVE всего лишь ECHO ed для целей тестирования. После того, как вы подтвердили правильность команд, измените значение ECHO(MOVE на MOVE, чтобы фактически переместить файлы. Append >nul подавить сообщения отчета (например. 1 file moved)

После создания каталогов, внешний контур помещает имя файла в %%a, следующий цикл получает первую часть этого названия, вплоть до, но не включая первый - или _ (delims) в %%b.

Внутренний цикл находит целевой каталог, содержащий %%b в целевом каталоге и строит соответствующую строку move.

1

Это решение рассматривает папки всего один раз и сохраняет их в массиве , поэтому этот метод должен работать быстрее.

@echo off 
setlocal EnableDelayedExpansion 

rem Process the folders 
set i=0 
for /D %%a in (*) do (

    rem Store this folder in the next array element 
    set /A i+=1 
    set "folder[!i!]=%%a" 

    rem Separate folder in parts and store the number of the array element in each one 
    for %%b in (%%a) do set "part[%%b]=!i!" 

) 

rem Process the files 
for %%a in (*.xml) do (

    rem Get the first part of name 
    for /F "delims=-_" %%b in ("%%a") do (

     rem If such a folder exists... 
     if defined part[%%b] (

     rem Get the number of the corresponding array element and move the file 
     for %%n in (!part[%%b]!) do ECHO move "%%a" "!folder[%%n]!" 

    ) else (

     echo No folder exists for this file: "%%a" 

    ) 

    ) 
) 

Этот метод имеет также ряд преимуществ: вы можете проверить, если определенная папка не существует, или получить количество файлов, перемещенных в каждую папку, и т.д. Если вы не заинтересованы в этих точках, просто удалите if команду и сделать код проще ...

Объяснение управления массивами в пакетных файлах дано в this answer.