Компьютерный форум 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=337401)

ChevConnor 26-10-2018 19:37 2837808

Сортировка файлов в каталоге с подкаталогами
 
Прошу помощи! У меня есть каталог ( папка ) с подкаталогами ( папками ). В каталоге есть файлы скажем .txt .doc .pdf
Мне нужно отсортировать их по расширению и распределить в отдельном каталоге с подкаталогами названия которых соответствуют расширению. Cортировку выполнить копированием. При этом чтобы после сортировки в файле .txt указывалась дата\время последних изменений
В том что я написал происходит следующее - файлы сортируются только из основного каталога, а из подкаталогов не затрагиваются, и каждый раз перезаписывает файл с временем\датой последних изменений.

@echo off
setlocal enabledelayedexpansion
xcopy *.txt sort\txt
DIR > sort\txt.txt
xcopy *.doc sort\doc
DIR > sort\doc.txt
pause

Iska 26-10-2018 20:02 2837815

ChevConnor, начните с описания того, что должен делать алгоритм, когда в разных подкаталогах ему встретятся одноимённые файлы.

Цитата:

Цитата ChevConnor
Cортировку выполнить копированием. »

Это новое слово в алгоритмизации. Мне лично — непонятное.

Цитата:

Цитата ChevConnor
При этом чтобы после сортировки в файле .txt »

Каком файле?

ChevConnor 26-10-2018 20:12 2837821

У меня есть папка, в ней файлы и папки (формата .txt .pdf .doc). Мне нужен сценарий, способный рассортировать файлы (и те что во вложенных каталогах) по расширению, в отдельном каталоге (папке) с подкаталогами, соответствующие расширению. Ну и чтобы после выполнения сценария создавался файл-отчет.txt c датой\временем последних изменений.

По тому "сценарию" (его подобию скорее) у меня сортируются файлы в каталоге в котором находится батник, а подкаталоги не затрагиваются. Дату\время последних изменений записывает в отдельном файле, это вроде получилось.

alpap 26-10-2018 20:31 2837826

Цитата:

Цитата ChevConnor
c датой\временем последних изменений »

изменений чего и где?
Цитата:

Цитата ChevConnor
Дату\время последних изменений записывает в отдельном файле, это вроде получилось »

если речь об этом
Цитата:

Цитата ChevConnor
DIR > sort\txt.txt »

то там информации намного больше чем требуется
а вообще не судьба открыть справку: dir /? и почитать как ею пользоваться?

ChevConnor 26-10-2018 20:35 2837829

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

alpap 26-10-2018 20:38 2837831

Цитата:

Цитата ChevConnor
Понимал бы я »

Цитата:

Цитата ChevConnor
проблема в этом »

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

ChevConnor 26-10-2018 20:42 2837833

Увы, 2й день сижу, я в этом деле, не как вы, а новичок можно сказать, плоховато у меня с написанием, вот и решил попросить помощи у знающих людей, а советов, кроме как банально открыть dir /? как то и нету, одни подколы

Iska 26-10-2018 20:45 2837834

ChevConnor, Вы не ответили на вопрос: что должен делать алгоритм, когда ему в разных каталогах встретятся одноимённые файлы? Например, в каталоге …\Моя папка\Моя новая папка ему встретился файл Мой любимый файл.doc, он его скопировал/переместил в каталог …\Моя любимая папка для сортировки\DOC под тем же именем Мой любимый файл.doc. Затем он встречает в каталоге …\Моя папка\Моя новая папка 2 файл с ровно тем же именем — Мой любимый файл.doc. Что должен сделать алгоритм?

Цитата:

Цитата ChevConnor
Понимал бы я как с подкаталогов скопировать файлы, я бы не создавал тему, проблема в этом у меня заключается »

Far Manager, Alt-F7, Enter, Панель, (стать на первый найденный файл, Ctrl-GrayPlus, F6, End, {txt|pdf|doc}\, Enter) повторить три раза. Вручную это делается за пару минут безо всяких скриптов.

Ваша проблема в том, что Вы не можете сами для себя точно сформулировать задачу.

ChevConnor 26-10-2018 20:50 2837838

Cоздать копию думаю. Просто файлов много и там названия неповторяющиеся (Pm1024zm.txt Pm1025zm.txt и т.д) не задумывался над этим

megaloman 26-10-2018 20:54 2837840

Еcли расширения известны.
C сохранением структуры папок+создаются файлы ^^^^^^.log в каждой выходной папке по расширению
Код:

@Echo Off
        Set "BoxIn=D:\Мой контент\Книги"
        Set "BoxOut=Z:\Box_Out\Книги"
        Set "Ext=fb2 epub txt pdf txt"

        For %%e IN (%Ext%) DO (
                Md "%BoxOut%.%%e" 2>nul
                >"%BoxOut%.%%e\^^^^^^.log" (For /F "usebackq delims=" %%i IN (`Xcopy /Y /S "%BoxIn%\*.%%e" "%BoxOut%.%%e\"`) DO (
                        If Exist "%%i" Echo %%~ti "%%i"
                ))
        )
GoTo :Eof

Еcли расширения известны.
Без сохранениея структуры папок+создаются файлы ^^^^^^.log в каждой выходной папке по расширению
Код:

@Echo Off
        Set "BoxIn=D:\Мой контент\Книги"
        Set "BoxOut=Z:\Box_Out\Книги"
        Set "Ext=fb2 epub txt pdf txt"

        For %%e IN (%Ext%) DO (
                Md "%BoxOut%.%%e" 2>nul
                >"%BoxOut%.%%e\^^^^^^.log" (For /F "usebackq delims=" %%i IN (`Xcopy /L /S "%BoxIn%\*.%%e" "%Tmp%\"`) DO (
                        If Exist "%%i" (Copy "%%i" "%BoxOut%.%%e\" >nul &Echo %%~ti "%%i")
                ))
        )
GoTo :Eof


ChevConnor 26-10-2018 21:18 2837843

Немного не получилось, скрипт создал папки, с названием расширения, но ничего не копировал в них, лишь создавая пустой файл .log. Мне нужно понять, как сделать так, чтобы скрипт копировал\переносил файлы с подкаталогов и распределял их в отдельную папку с уже готовыми подкаталогами названия которых соответствуют расширению файлов.
Извиняюсь если непонятно обьясняю, просто 2й день уже голову ломаю, не мозг а каша..

megaloman 26-10-2018 22:07 2837853

ChevConnor, Прикрепите к сообщению свой скрипт, переименованный в txt.
Похоже, у Вас неправильный путь к файлам. Добавьте к коду 2 строки для отладки.
Код:

@Echo Off
        Set "BoxIn=D:\Мой контент\Книги"
        Set "BoxOut=Z:\Box_Out\Книги"
        Set "Ext=fb2 epub txt pdf txt"

        Dir "%BoxIn%\*.*" /S /B /A:-D
        pause

        For %%e IN (%Ext%) DO (
                Md "%BoxOut%.%%e" 2>nul
                >"%BoxOut%.%%e\^^^^^^.log" (For /F "usebackq delims=" %%i IN (`Xcopy /L /S "%BoxIn%\*.%%e" "%Tmp%\"`) DO (
                        If Exist "%%i" (Copy "%%i" "%BoxOut%.%%e\" >nul &Echo %%~ti "%%i")
                ))
        )
GoTo :Eof

Список файлов отображается?

ChevConnor 26-10-2018 22:22 2837857

Вложений: 1
вот, теперь вышло, большое спасибо!

ChevConnor 27-10-2018 00:58 2837876

А в повершеле такое реально сделать? если можно объясните как, заранее благодарен.

YuS_2 27-10-2018 12:52 2837934

Цитата:

Цитата ChevConnor
А в повершеле такое реально сделать? »

Вы всё ещё кипятите? Тогда мы идем к вам! :)
Цитата:

Цитата ChevConnor
если можно объясните как »

На счет объяснений... это, наверное, в умные книжки придется заглядывать...
А вообще, примерно так:
Код:

function make-cat {
        process {
                $a = $dst + '\' + $d + $_.extension
                if (!(test-path $a -pathtype container)){
                        ni $a -type directory|out-null
                        if ($swchlog) {"Создан каталог $a"|out-file $log -enc utf8 -app}
                }
        }
}
function move-file {
        process {
                $i,$fdst=0,$null
                $pthdst = $dst + '\' + $d + $_.extension
                if (test-path ($pthdst + '\' + $_.name)){
                        $fdst = $pthdst + '\' + $_.basename
                        while (test-path ($fdst + $_.extension)){
                                $i = [int] $(if($fdst -match '.*_copy(\d+)'){
                                        [int]$matches[1]
                                } else {0}) + 1
                                $fdst = $pthdst + '\' + $($_.basename -replace '_copy\d+') + '_copy' + "$i".padleft(3,"0")
                        }
                        $pthdst = $fdst + $_.extension
                }
                mi $_.fullname $pthdst
                if ($swchlog) {
                        "Перемещён файл $($_.fullname) в каталог $($dst + '\' + $d + $_.extension)"|
                        out-file $log -enc utf8 -app
                }
        }
}


$src = 'd:\222'                # Путь к каталогу для сортировки по расширению
$dst = '.\1'                        # Путь к целевому каталогу
$d = '!sort'                        # Префикс для каталогов по расширению
$log = 'log.txt'                # Имя для логфайла
$swchlog = $true                  # Вести лог?

$list = dir $src -file -force -rec
$list|select extension -uni|make-cat                # Создаем каталоги
$list|move-file                                        # Перемещаем файлы

При совпадении имен целевых файлов, будет создаваться новое имя файла по шаблону:
Name_copyXXX.ext
где XXX - номер от 001 до 999

Busla 27-10-2018 14:11 2837955

ChevConnor, не надо складывать результат работы туда же, откуда забираются файлы в работу:
Код:

Set "BoxIn=C:\Users\Claymore\Desktop\Files"
Set "BoxOut=C:\Users\Claymore\Desktop\Files\sorted"

Вы пишите одно:
Цитата:

Цитата ChevConnor
распределить в отдельном каталоге с подкаталогами »

, а подразумеваете/делаете другое. Потому у вас и не получается со скриптами, что испытываете сложности с формулировками.


Цитата:

Цитата ChevConnor
в повершеле такое реально сделать? если можно объясните как »

что значит: "объясните как"? - прочитайте учебник по powershell
там по порядку расписано какие есть команды, что они делают, как их использовать
когда будет общее представление о языке, тогда можно будет уже обсудить конкретные неочевидные моменты

alpap 27-10-2018 17:34 2837987

а так не достаточно (по поводу даты изменения чего-то так и не дождался ответа, сделал просто лог с датой операции)?
Код:

@echo off
set "katalog=C:\papka"
set "out=C:\out"

if not exist "%out%" md "%out%"
pushd "%katalog%"
 for /f "delims=" %%a in ('dir /a-d/b/s') do set "exp=%%~xa"& call :cpr "%%a" "%out%\%%exp:*.=%%" "%out%\log.txt"
popd
pause& exit

:cpr
 if not exist "%~2" md "%~2"
 if not exist "%~2\%~n1%n%%~x1" (
  >nul copy "%~1" "%~2\%~n1%n%%~x1"
  >>"%~3" (cmd /v/c echo !date!_!time:~0,8!& echo copy "%~1" "%~2\%~n1%n%%~x1")
 ) else (
  set /a n+=1& goto cpr
 )
exit /b


ChevConnor 27-10-2018 20:57 2838008

Только с работы пришел, да лог с изменениями и датой подошел, спасибо огромное ребят, очень помогли

Amunrah 28-10-2018 10:07 2838062

alpap Если счетчик не сбрасывать, то он у вас будет нумеровать вообще все файлы, стоит ему только раз получить значение...

megaloman 28-10-2018 12:07 2838076

ChevConnor,
Код:

@Echo Off
        Set "BoxIn=D:\Мой контент\Книги"
        Set "BoxOut=Z:\Box_Out\Книги"
rem        Set "BoxOut=D:\Мой контент\Книги"
       
        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Now=%%d"
        Set Now=%Now:~0,14%

        For /F "usebackq delims=" %%i IN (`2^>nul Dir "%BoxIn%\*.*" /B /S /A:-D`) DO (
                If /I Not "%BoxOut%%%~xi\"=="%%~dpi" (
                        If Not Exist "%BoxOut%%%~xi\*%%~xi" Md "%BoxOut%%%~xi"
                        >>"%BoxOut%%%~xi\^^^^^^_%Now%.Log" Echo %%~ti "%%i"
                        Copy "%%i" "%BoxOut%%%~xi\" >nul
                )
        )
GoTo :Eof

Вот вариант: Файлы рассортировываются по каталогам с именами по расширению. Имена входного и выходного каталогов могут совпадать (так как к имени выходного каталога по любому добавится расширение файлов). В каждом каталоге по имени расширения добавляется лог-файл с именем ^^^^^_ГГГГММДДччммсс.log, где ГГГГММДДччммсс-время старта батника. Начало имени ^^^^^ -сделано для того, чтобы по алфавиту название было вверху.
В лог файле прописаны время изменения копируемого файла и его имя

Amunrah 28-10-2018 13:06 2838087

megaloman, Для чего к имени выходного каталога добавлять расширение? Нет же такого требования в условии ))
И, кстати, через exist можно проверить наличие каталога просто указав в конце слэш "\"

Iska 28-10-2018 13:21 2838092

Цитата:

Цитата Amunrah
И, кстати, через exist можно проверить наличие каталога просто указав в конце слэш "\" »

Совсем правильным будет так:
Код:

if exist "Some path\." (
    …
)

— т.е., ссылка на самого себя.

alpap 28-10-2018 16:19 2838110

Цитата:

Цитата Amunrah
то он у вас будет нумеровать вообще все файлы »

можно добавить:
Код:

...
setlocal
 if not exist "%~2\%~n1%n%%~x1" (
  >nul copy "%~1" "%~2\%~n1%n%%~x1"
  >>"%~3" (cmd /v/c echo !date!_!time:~0,8!& echo copy "%~1" "%~2\%~n1%n%%~x1")
 ) else (
  set /a n+=1& goto cpr
 )
endlocal
exit /b


megaloman 28-10-2018 16:45 2838111

Цитата:

Цитата Amunrah
Для чего к имени выходного каталога добавлять расширение? Нет же такого требования в условии )) »

Ну, если это лабораторка, тогда конечно ...
Код:

@Echo Off
        Set "BoxIn=Z:\Box_In\Мой контент\Книги"
        Set "BoxOut=Z:\Box_Out\Книги"
       
        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Now=%%d"
        Set Now=%Now:~0,14%

        For /F "usebackq delims=" %%i IN (`2^>nul Dir "%BoxIn%\*.*" /B /S /A:-D`) DO Call :MySort "%%i" "%BoxOut%" %Now%
GoTo :Eof

:MySort
        Set "NewDir=%~x1"
        If "%NewDir%"=="" Set "NewDir=.."
        Set "NewDir=%~2\%NewDir:~1%"
        If Not Exist "%NewDir%" Md "%NewDir%"
        >>"%NewDir%\^^^^^^_%3.Log" Echo %~t1 %1
        Copy %1 "%NewDir%\" >nul
GoTo :Eof

Входная и выходная папка не должны совпадать
Однако, представьте себе, а что если файлы без расширения, с каким именем папку создавать? Поэтому, имхо, если по делу, лучше к имени выходного каталога добавлять расширение и туда копировать файлы. Кстати, в этом предложенном варианте при отсутствии расширения папка не создастся и файлы будут писаться прямо в выходной каталог.
Если всё же вам нужны строго определённые расширения,то
Код:

@Echo Off
        Set "BoxIn=Z:\Box_In\Мой контент\Книги"
        Set "BoxOut=Z:\Box_Out\Книги"

        Set "Ext=.pdf .fb2 . .epub"

        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Now=%%d"
        Set Now=%Now:~0,14%

        For %%e IN (%Ext%) DO (
                For /F "usebackq delims=" %%i IN (`2^>nul Dir "%BoxIn%\*%%e" /B /S /A:-D`) DO Call :MySort "%%i" "%BoxOut%" %Now%
        )
GoTo :Eof

:MySort
        Set "NewDir=%~x1"
        If "%NewDir%"=="" Set "NewDir=.."
        Set "NewDir=%~2\%NewDir:~1%"
        If Not Exist "%NewDir%" Md "%NewDir%"
        >>"%NewDir%\^^^^^^_%3.Log" Echo %~t1 %1
        Copy %1 "%NewDir%\" >nul
rem        Move /Y %1 "%NewDir%\" >nul
GoTo :Eof

При желании можно заменить Copy на Move

Amunrah 28-10-2018 19:01 2838134

megaloman
Цитата:

Цитата megaloman
Ну, если это лабораторка, тогда конечно ... »

Просто у человека вполне конкретные пожелания были - раскидать не повторяющиеся (он это уточнял) файлы из имеющейся папки в отдельную по подпапкам с именами расширений. И вроде вполне логично, что файлы без расширений упадут в выходной каталог. А вот, если начать всякие допущения делать, то это действительно на лабораторку станет похоже, хотя дело ваше конечно, спорить не буду ) но тогда и нестандартные символы в путях, на подобии «» тоже учесть стОит...

А если не заморачиваться, то можно так:
Код:

@echo off

set "src=source_dir"
set "dest=destination_dir"

if not exist "%dest%\." md "%dest%"

forfiles /p "%src%" /m *.* /s -c ^
"cmd /c xcopy @path %dest%\@ext\ /i /c /f /h /y">>%dest%\log.txt

exit


megaloman 28-10-2018 23:18 2838186

Amunrah,
Цитата:

Цитата ChevConnor
чтобы после выполнения сценария создавался файл-отчет.txt c датой\временем последних изменений. »

У Вас это делается? А как насчёт файлов без расширения? Они не обрабатываются.

Я не всегда решаю задачи, как они сформулированы пользователем, не всегда задача бывает, на мой взгляд, сформулирована оптимально. Каюсь, грешен, ищу решение, которое считаю наилучшим. Грешен, не всегда получается с первого раза этого добиться. Завидую безгрешным. Простите мне этот грех :)

Amunrah 29-10-2018 07:07 2838203

megaloman
Цитата:

Цитата megaloman
Цитата:

чтобы после выполнения сценария создавался файл-отчет.txt c датой\временем последних изменений
. »
У Вас это делается? А как насчёт файлов без расширения? Они не обрабатываются. »

Хотя обработку файлов без расширений не заказывали (пока что автору вопроса оно не надо), но тоже решаемо. И дату в конце воткнуть, это да, обязательно)
Код:

@echo off

set "src=source_dir"
set "dest=destination_dir"

if not exist "%dest%\." md "%dest%"

forfiles /p "%src%" /m * /s -c ^
"cmd /c if @isdir==FALSE xcopy @path %dest%\@ext\ /ifchy">>%dest%\log.txt

echo."Время последних изменений - %date% %time:~0,8%">>%dest%\log.txt

Но, если начинать, то можно еще предположить, что bat-ник будет использоваться не однократно (иначе зачем автоматизировать?). Тогда имеет смысл обрабатывать только свежие файлы (если скрипт будет запускаться, например, как ежедневное задание). Однако, опять-же, никто об этом не спрашивал...
Код:

@echo off

set "src=source_dir"
set "dest=destination_dir"

if not exist "%dest%\." md "%dest%"

forfiles /p "%src%" /m * /s /D:0 /c ^
"cmd /c if @isdir==FALSE xcopy @path %dest%\@ext\ /ifchy">>%dest%\log.txt

echo."Время последних изменений - %date% %time:~0,8%">>%dest%\log.txt

Цитата:

Я не всегда решаю задачи, как они сформулированы пользователем, не всегда задача бывает, на мой взгляд, сформулирована оптимально. Каюсь, грешен, ищу решение, которое считаю наилучшим. Грешен, не всегда получается с первого раза этого добиться. Завидую безгрешным. Простите мне этот грех
Да все мы грешны... Просто уточнил, было как-то не очевидно. Все, вопрос снят, теперь понятно )

Busla 29-10-2018 10:56 2838227

Цитата:

Цитата megaloman
У Вас это делается? А как насчёт файлов без расширения? Они не обрабатываются.
Я не всегда решаю задачи, как они сформулированы пользователем, не всегда задача бывает, на мой взгляд, сформулирована оптимально. »

Ну, оптимально и не надо все файлы раскладывать по расширениям, т.к. банально некоторые теряют смысл в отрыве от контекста, например thumbs.db, desktop.ini. Логичнее обрабатывать конкретные заказанные пользователем типы.

megaloman 29-10-2018 13:18 2838246

Amunrah, Простите за занудство.
Цитата:

Цитата Amunrah
можно еще предположить, что bat-ник будет использоваться неоднократно »

ИМХО, это правильная идея, (каюсь, поленился сделать), но Ваш код не работает: ОШИБКА: Не найдены файлы, отвечающие условиям поиска.
Возможно я извратил его недопустимым образом
Код:

@echo off

set "src=Z:\Box_In\Мой контент\Книги"
set "dest=Z:\Box_Out\Книги"

if not exist "%dest%\." md "%dest%"

forfiles /p "%src%" /m * /s /D:0 /c ^
"cmd /c if @isdir==FALSE xcopy @path %dest%\@ext\ /ifchy">>%dest%\log.txt

echo."Время последних изменений - %date% %time:~0,8%">>%dest%\log.txt


Ваш первый батник отрабатывает нормально (разве что Ваш лог не нравится - но это мой испорченный вкус) ИМХО, если батник запускать многократно, тогда обязательно или в логе или в имени лога должна быть дата\время запуска

Amunrah 29-10-2018 13:48 2838248

megaloman
Цитата:

Цитата megaloman
ИМХО, это правильная идея, (каюсь, поленился сделать), но Ваш код не работает: ОШИБКА: Не найдены файлы, отвечающие условиям поиска
Ваш первый батник отрабатывает нормально (разве что Ваш лог не нравится - но это мой испорченный вкус) ИМХО, если батник запускать многократно, тогда обязательно или в логе или в имени лога должна быть дата\время запуска


Странно, у меня нормально срабатывает. Спасибо что проверили. Можно еще так попробовать (возможно дело в написании ключа), к сожалению сейчас под рукой только один комп.

Код:

@echo off

set "src=source_dir"
set "dest=destination_dir"

if not exist "%dest%\." md "%dest%"

echo."Время начала запуска - %date% %time:~0,8%">>%dest%\log.txt

forfiles /p "%src%" /m * /s /D 0 -c ^
"cmd /c if @isdir==FALSE xcopy @path %dest%\@ext\ /ifchy">>%dest%\log.txt

echo."Обработка завершена - %date% %time:~0,8%">>%dest%\log.txt


megaloman 29-10-2018 14:50 2838256

Amunrah,
Вот вариант для многократного запуска. Повторное копирование файлов за одну дату/время не происходит
Код:

@Echo Off
        Set "BoxIn=Z:\Box_In\Мой контент\Книги"
        Set "BoxOut=Z:\Box_Out\Книги"

        Set "Mask=*.*"
rem        Set "Mask=*.pdf *.fb2 *. *.epub"
       
        Pushd "%BoxIn%" ||(Echo Input folder not found "%BoxIn%" &Pause &Exit /B 2)

        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "Now=%%d"
        Set Now=%Now:~0,14%

        For /F "usebackq delims=" %%i IN (`2^>nul Dir %Mask% /B /S /A:-D /O:D`) DO (Set "Text=%%~xi." &Call :MySort "%%i" "%BoxOut%\%%Text:~1%%\%%~nxi" %Now%)
        Popd
GoTo :Eof

:MySort
        If Exist %2 If /I "%~t1"=="%~t2" Exit /B 1
        If Not Exist "%~dp2" Md "%~dp2"
        >>"%~dp2\^^_%3.Log" Echo %~t1 %1
        >>"%BoxOut%\^^^_All_%3.Log" Echo %~t1 %1
        Copy %1 %2 >nul
GoTo :Eof

Лог-файлы создаются для каждого расширения в каждой папке.
При многократном запуске наверное важен обзорный лог - сделал
Можно задавать список масок: выбирай хоть избранные файлы, хоть все
Ваш вариант, похоже, сомнительный, по функционалу не универсальный из-за ключа /D 0 в forfiles. Я не очень привык к forfiles, возможно ошибаюсь, но это приводит к обработке файлов только за сегодня. Поэтому возможно и была ошибка у меня - в инбоксе были только старые файлы и ничего для копирования найдено не было.

Amunrah 29-10-2018 16:43 2838272

megaloman,
Цитата:

Цитата megaloman
Ваш вариант, похоже, сомнительный, по функционалу не универсальный из-за ключа /D 0 в forfiles. Я не очень привык к forfiles, возможно ошибаюсь, но это приводит к обработке файлов только за сегодня. Поэтому возможно и была ошибка у меня - в инбоксе были только старые файлы и ничего для копирования найдено не было. »

Как уже говорил, я не сторонник додумывать за окружающих и писать многофункциональный комбайн к банальному вопросу. Всех моментов все-равно не учесть, но, главное, это и незачем. Как гласит одна из прописных истин дзэн-питона - Простое лучше чем сложное. Переубеждать не стану конечно.
Мой вариант решает именно то, что озвучил топикстартер, не более. В forfiles к ошибке обычно приводит ключ /c (на некоторых виндах) поэтому вместо него рекомендуют использовать . В остальном все замечательно и утилита прекрасно справляется. Поэтому останусь при своем.

А ключ /D можно использовать (или не использовать) как в forfiles, так и в xcopy:
/D:m-d-y - Копирование файлов, измененных не ранее указанной даты. Если дата не указана, заменяются только конечные файлы, более старые, чем исходные.


Скрытый текст
Код:

set "src=source_dir"
set "dest=destination_dir"

if not exist "%dest%\." md "%dest%"

echo."Время начала запуска - %date% %time:~0,8%">>%dest%\log.txt

forfiles /p "%src%" /m * /s -c ^
"cmd /c if @isdir==FALSE xcopy @path %dest%\@ext\ /ifchy">>%dest%\log.txt



Цитата:

ИМХО, это правильная идея, (каюсь, поленился сделать).
Рад что моя идея вам понравилась, но надо-ли оно кому-то пока вопрос... и шкалу прогресса прикрутить не забудьте, а то не комильфо :)

ChevConnor 31-10-2018 18:20 2838709

Спасибо большое ребят. Очень помогли.

megaloman 12-11-2018 14:38 2840389

Цитата:

Цитата ChevConnor
Мне нужно чтобы файл работал в текущем каталоге, а он работает только по указанному пути в BoxIn BoxOut. ... чтобы запускаемый батник работал в текущем каталоге без указания пути?
Set "BoxIn=C:\Users\Claymore\Desktop\Files"
Set "BoxOut=C:\Users\Claymore\Desktop\Files\sorted\"

Не очень помню задачу, замените эти строки на
Код:

FOR /F "usebackq delims=" %%s IN (`CD`) DO Set "BoxIn=%%s"
If "%BoxIn:~-1%"=="\" Set "BoxIn=%BoxIn:~0,-1%"
Set "BoxOut=%BoxIn%\sorted"

Echo BoxIn =%BoxIn%
Echo BoxOut=%BoxOut%

Echo, естественно, можно убить


Время: 13:28.

Время: 13:28.
© OSzone.net 2001-