Перемещение файлов по количеству из списка
есть разные файлы
и есть список:
3
10
2
7
8
...
как сделать, чтобы BAT:
1. отсортировав файлы по дате создания (! а не по имени)
2. перенес 3 первых в папку "001", 10 следующих в папку "002", потом 2 файла в папку "003" и.т.д. по списку
|
вариант через временный файл:
Код:
@echo off
set $list=list.txt
set $from=C:\TEST1
set $dest=C:\TEST2
if exist "%~n0.tmp" del "%~n0.tmp"
if not exist "%$dest%" md "%$dest%"
for /f "usebackq" %%i in ("%$list%") do (
set /a $M+=1
call set $D=00%%$M%%
call set $D=%%$D:~-3%%
for /l %%a in (1,1,%%i) do call >>"%~n0.tmp" echo.%%$D%%
)
for /f "tokens=1* delims=[]" %%i in ('dir /b/a-d/od/tc "%$from%"^|find /n /v ""') do (
for /f "tokens=1* delims=[]" %%a in ('^<"%~n0.tmp" find /n /v ""') do if %%i==%%a (
if not exist "%$dest%\%%b" md "%$dest%\%%b"
move "%$from%\%%j" "%$dest%\%%b"
)
)
- файлы обрабатываются без подкаталогов;
- каталоги "источника" и "приемника" должны быть на одном диске;
- сортировка файлов по возрастанию даты (сперва более старые)
|
KIS 2011 даже чего то там фыркнул на эти 20 строк :)
поменял:
Код:
set $from=C:\TEST1
set $dest=C:\TEST2
на
Код:
set $from=%CD%
set $dest=%CD%
работает из текущего каталога, перемещает все, включая себя же =)
Отличный получился переносчик! amel27 как всегда на высоте
|
El Sanchez |
22-08-2010 13:54 1479280 |
shadowbat, вариант №2
Код:
@Echo Off
SetLocal EnableDelayedExpansion
Set Source=C:\Source
Set Output=C:\Output
Set List=C:\Source\list.txt
Set /A Skip=1
For /F "Tokens=1* Delims=:" %%A In ('Type "%List%"^|FindStr /N .') Do (
Set Folder=00%%A
Set Folder=!Folder:~-3!
Call :CopyFiles "!Skip!" "%%B"
Set /A Skip=!Skip!+%%B
)
EndLocal
GoTo :EOF
:CopyFiles
Set /A Count=0
For /F "Skip=%~1 Tokens=*" %%A In ('Echo.^&Dir /B /A-D /OD /TC') Do (
Set /A Count+=1
If !Count! LEQ %~2 (XCopy /CFRZY "%Source%\%%A" "%Output%\!Folder!\")
)
|
вариант El Sanchez, натолкнул меня на немного извращенный алгоритм, к тому же решающий немного другую задачу, совпадающую с исходной только при изначально пустых или отсутствующих папках 001, 002,...
Код:
@Echo Off
SetLocal EnableDelayedExpansion
Set $list=list.txt
Set $from=C:\TEST1
Set $dest=C:\TEST2
Set $F=%$from%& For /F "Tokens=1* Delims=[]" %%i In ('^<"%$list%" Find /N /V ""') Do (
Set $D=00%%i& Set $D=%$dest%\!$D:~-3!& Set /A $S=!$B!+1& Set $B=%%j
Call:MOVE& Set $F=!$D!)
Set $D=%$from%& Set /A $S=%$B%+1& Call:MOVE& Exit /B
:MOVE
If Not Exist "%$D%" MD "%$D%"
For /F "Skip=%$S% Delims=" %%a In ('Echo.^& DIR /B/A-D/OD/TC "%$F%"') Do Move "%$F%\%%a" "%$D%"
Exit /B
сначала ВСЕ файлы переносятся в 001, потом из неё все кроме 3-х в 002, потом все кроме 10 в 003 и т.д. на последнем шаге все "лишние" возвращаются в исходную папку... :teeth:
|
Еще вариант, папки могут быть на разных дисках.
Код:
@Echo Off
SetLocal enabledelayedexpansion
Set input=c:\Temp\MAIL
Set output=g:\out
Set list=list.txt
Set Num=0
For /F %%i In (%list%) Do Set /a Num+=1& Set $var!Num!=%%i
Set Num=0& Set tNum=0
For /F "UseBackQ Delims=" %%a In (`Dir "%input%" /B /OD /A-D 2^>Nul`) Do (
If !tNum!==0 Call :_rNum
xCopy /Y "%input%\%%a" "%output%\!Folder!\"
Del /Q "%input%\%%a"
Set /a tNum-=1
)
Exit
:_rNum
Set /a Num+=1
If Not Defined $var%Num% Exit
Set tNum=!$var%Num%!
Set Folder=00%Num%
Set Folder=%Folder:~-3%
GoTo :EOF
|
самый первый вариант у меня не сработал, если в имени папки есть пробел. т.е. если работать в верхних уровнях типа C:\111 - работает отлично. как только переходим на более сложное типа С:\Program files\1 11 - все. пишет "файл не найден" =)
|
shadowbat, кавычек в DIR не хватало - добавил
|
работает 
|
пока что остановился на 4-ом варианте, заменив
Код:
Set input=%CD%
Set output=%CD%
|
Время: 21:03.
© OSzone.net 2001-