Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Перемещение файлов по количеству из списка (http://forum.oszone.net/showthread.php?t=183552)

shadowbat 22-08-2010 10:30 1479110

Перемещение файлов по количеству из списка
 
есть разные файлы

и есть список:
3
10
2
7
8
...

как сделать, чтобы BAT:
1. отсортировав файлы по дате создания (! а не по имени)
2. перенес 3 первых в папку "001", 10 следующих в папку "002", потом 2 файла в папку "003" и.т.д. по списку

amel27 22-08-2010 12:24 1479193

вариант через временный файл:
Код:

@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"
  )         
)

- файлы обрабатываются без подкаталогов;
- каталоги "источника" и "приемника" должны быть на одном диске;
- сортировка файлов по возрастанию даты (сперва более старые)

shadowbat 22-08-2010 13:39 1479267

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


amel27 22-08-2010 16:40 1479390

вариант 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:

gora 22-08-2010 16:54 1479396

Еще вариант, папки могут быть на разных дисках.
Код:

@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


shadowbat 23-08-2010 00:25 1479655

самый первый вариант у меня не сработал, если в имени папки есть пробел. т.е. если работать в верхних уровнях типа C:\111 - работает отлично. как только переходим на более сложное типа С:\Program files\1 11 - все. пишет "файл не найден" =)

amel27 23-08-2010 07:05 1479730

shadowbat, кавычек в DIR не хватало - добавил

shadowbat 23-08-2010 11:18 1479841

работает

shadowbat 29-08-2010 15:36 1484203

пока что остановился на 4-ом варианте, заменив
Код:

Set input=%CD%
Set output=%CD%



Время: 21:03.

Время: 21:03.
© OSzone.net 2001-