PDA

Показать полную графическую версию : Архивирование каталога


Страниц : 1 [2]

megaloman
06-11-2018, 10:52
@Echo Off
cls
Set "Src=Z:\Box_In\Мой контент\Книги"
rem Set "Mask=File_2018-10-??_Original."
Set "Mask="

Set "Dst=Z:\Книги.arc"

Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -dh -m3 -s -rr5p -ts+ -y
Set "Ext=rar"

Pushd "%Src%" || (Echo Folder not Found "%Src%" &Pause &Exit /B 2)
If Not Exist "%Dst%" Md "%Dst%" || (Echo Folder not Created "%Dst%" &Pause &Exit /B 3)

If Not "%Mask%"=="" GoTo :OneFile
Set /A Err=1
For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B /O:N`) DO Set /A Err=0 &Call :OutArc "%%d"
GoTo :End
:OneFile
Set "Name="
For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B /O:N`) DO Set "Name=%%d"
If "%Name%"=="" (Echo File or Folder not Found "%Src%\%Mask%" &Pause &Exit /B 1)

Call :OutArc "%Name%"
Set /A Err=%ErrorLevel%
:End
Popd
pause
Exit /B %Err%

:OutArc
If Not Exist "%Dst%\%~1.*" (Echo "%Src%\%~1" &%Arc% "%Dst%\%~1.%Ext%" "%~1")
Exit /B

UserX
06-11-2018, 18:03
megaloman, Всё превосходно работает!

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

Для того, чтобы не грузить маску иным, нехарактерным для неё смыслом, я решил ввести в скрипт дополнительный параметр "Mode".
Если установить Set "Mode=1", то получим однофайловый режим, а при любых других значениях Mode, например, если установить Set "Mode=0", получим режим архивации всех файлов из Src, архивов которых ещё нет в Dst.
Ну, и ещё добавил режим сортировки, дабы в однофайловом режиме архивировался либо первый, либо последний файл или каталог в зависимости от заданного режима сортировки.
Set "Ascending=" прямая сортировка - архивируется последний каталог или файл по маске.
Set "Ascending=-" обратная сортировка - архивируется первый каталог или файл по маске.

Естественно, ничего моего в полученном скрипте нет, всё полностью сделано из Вашего последнего скрипта. Просто он теперь полностью решает вместе и первую и вторую задачи по маске.

Прошу Вас, как настоящего профессионала, на всякий случай, посмотреть и проверить - не напорол ли я каких-либо косяков при "модернизации" Вашего превосходного исходника.
Ну, или, может можно сделать как-то изящнее, поскольку изначально задача мною озвучивалась совсем иначе.


@Echo Off
cls
;Rem Mode must be set to 1 for OneFileMode or any value (0) for AllFilesMode
Set "Mode=1"
;Rem Set "Mode=0"

Set "Src=C:\111\Src"
Set "Dst=C:\111\Dst"
Set "Mask=??10??"
;Rem Маска всех октябрьских файлов и каталогов.
;Rem Mask - Mask for catalogs or files in Src.

;Rem Set "Ascending="
;Rem "Ascending=" прямая сортировка - архивируется последний каталог или файл по маске
Set "Ascending=-"
;Rem Set "Ascending=-" обратная сортировка - архивируется первый каталог или файл по маске

Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -ma4 -m5 -rr5p -ts+ -y
Set "Ext=rar"

Pushd "%Src%" || (Echo Folder not Found "%Src%" &Pause &Exit /B 2)
If Not Exist "%Dst%" Md "%Dst%" || (Echo Folder not Created "%Dst%" &Pause &Exit /B 3)

If "%Mode%"=="1" GoTo :OneFile
Set /A Err=1
For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B /O:%Ascending%N`) DO Set /A Err=0 &Call :OutArc "%%d"
GoTo :End
:OneFile
Set "Name="
For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B /O:%Ascending%N`) DO Set "Name=%%d"
If "%Name%"=="" (Echo File or Folder not Found "%Src%\%Mask%" &Pause &Exit /B 1)

Call :OutArc "%Name%"
Set /A Err=%ErrorLevel%
:End
Popd

pause
Exit /B %Err%

:OutArc
If Not Exist "%Dst%\%~1.*" (Echo "%Src%\%~1" &%Arc% "%Dst%\%~1.%Ext%" "%~1")
Exit /B


И ещё пара вопросов:
1) Команда "pause" в скрипте несёт какую-то иную цель, кроме сообщения о том, что батник выполнился и для продолжения нужно нажать любую клавишу? Имеется ввиду, удаление этой команды из скрипта не отразится на чём-либо ещё в его работе?
Просто мой опыт говорит, что порой что-то, на первый взгляд, очевидное таковым не всегда является в реалии. Поэтому, лучше лишний раз уточнить.
2) Как правильнее подавить вывод сообщений о результатах работы этого батника, если использовать его в заданиях Шедулера Виндовс? Ставить после каждой команды "> Nul" ? Или это делается как-то однократно в самом начале батника?
Вообще, что, на Ваш взгляд, имело бы смысл подправить в синтаксисе батника при его использовании в задании Шедулера?

megaloman
06-11-2018, 21:44
@Echo Off
cls
Set "Src=Z:\Box_In\Мой контент\Книги"
Set "Mask=File_2018-10-??_Original."
rem Set "Mask="

rem Set "DirKey=/O:-N /A:D"
Set "DirKey=/O:-N"

Set "Dst=Z:\Книги.arc"
Set "Log=%Dst%\%~nx0.log"

Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -dh -m3 -s -rr5p -ts+ -y
Set "Ext=rar"

Pushd "%Src%" || (Set MSG=Folder not Found "%Src%" &Set /A Err=2 &GoTo :End)
If Not Exist "%Dst%" Md "%Dst%" || (Set MSG=Folder not Created "%Dst%" &Set /A Err=3 &GoTo :End)

Set /A Err=1

If "%Mask%"=="" For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO (Set /A Err=0 &Call :OutArc "%%d")
If Not "%Mask%"=="" For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO (Set /A Err=0 &Call :OutArc "%%d" &GoTo :End)

:End
Popd

If "%Err%"=="1" (Set MSG=File or Folder not Found "%Src%\%Mask%" %DirKey%)
If Not "%Err%"=="0" >>"%Log%" Echo %Date% %Time% %Msg%
pause
Exit /B %Err%

:OutArc
If Not Exist "%Dst%\%~1.*" (
>>"%Log%" Echo %Date% %Time% "%Src%\%~1"
%Arc% "%Dst%\%~1.%Ext%" "%~1"
)
Exit /B
1. Pause можно/нужно закомментировать или убить
2. Если использовать батник в заданиях планировщика, то, наверное, надо иметь лог-файл. Если не надо, закомментируйте выделенные строки.
3. Для настройки работы команды Dir лучше использовать явным образом ключи. Делаем команду Dir /? и изучаем ключи и присваиваем нужный список переменной DirKey.
В частности, Set "DirKey=/O:-N /A:D" даст алфавитную сортировку в обратном порядке и включит в рассмотрение только папки.
4. Маску оставил как есть. В принципе можно легко ввести специальную переменную. Но не увидел большого смысла.
5. Я использую Winrar.exe, подозреваю, он работает быстрее.
Можно, конечно, использовать rar.exe, например:
Set Arc="C:\Program Files\WinRar\Rar.exe" a -r -dh -m3 -s -rr5p -ts+ -y
и подавить его вывод
%Arc% "%Dst%\%~1.%Ext%" "%~1" >nul
6. Set "Mask=??10??" » Я не очень вчитывался в код, но эту маску я не понимаю. Кстати, для читабельности кода используйте тег Code

UserX
06-11-2018, 23:24
Я использую Winrar.exe, подозреваю, он работает быстрее. » Попытка использовать в Windows 2008 R2 (x64) rar.exe вообще не прошла. Поэтому, только WinRar.exe.

Я не очень вчитывался в код, но эту маску (??10??) я не понимаю » Да это частный случай маски для файлов с именем YYMMDD, где в данном случае месяц указан конкретно ММ==10, т.е. октябрь.

Решил-таки оставить свою переменную Mode, поскольку без неё не будет работать произвольная маска выбора ВСЕХ файлов по заданной маске при их архивации, а будет иметься ввиду только маска *.* (сам ведь такую заказывал :) )
Собственно, только ради этого смысла и была введена переменная Mode

Огромное Вам спасибо за проделанную работу, представленный мастер-класс, в результате которого мною была получена бесценная информация. Спасибо Вам ещё раз.

UserX
07-11-2018, 03:46
megaloman, Предложенный Вами последний оптимизированный батник перестал работать так, как он работал ранее и так, как мне было нужно. Изменить его так, чтобы он остался оптимизмрованным и при этом работал так, как он работал до последней оптимизации мне не удалось.

Всё-таки, мне очень нужно ввести переменную Mode, поскольку она позволяет работать с заданной маской в любом из двух режимов:
в режиме AllFilesMode (с заданной маской) и в режиме OneFileMode (тоже с заданной маской).
То, что приведено ниже, сейчас работает так, как нужно, но оно не оптимизировано и нет вывода логов.
Пожалуйста, помогите оптимизировать для планировщика приведённый батник, в котором указываются режимы Mode 0 и Mode 1.
Заранее большое спасибо.



@Echo Off
;Rem Mode must be set to 1 for OneFileMode or any value (0) for AllFilesMode
Set "Mode=0"
;Rem Set "Mode=1"

Set "Src=C:\111\Src"
Set "Dst=C:\111\Dst"
Set "Mask=File_2018-10-??_Original."
;Rem Mask - Mask for catalogs or files in Src.

Set "DirKey=/O:N"
Rem Set "DirKey=/O:-N"


Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -ma4 -m5 -rr5p -ts+ -y
Set "Ext=rar"

Pushd "%Src%" || (Echo Folder not Found "%Src%" &Exit /B 2)

If Not Exist "%Dst%" Md "%Dst%" || (Echo Folder not Created "%Dst%" &Exit /B 3)

If "%Mode%"=="1" GoTo :OneFileMode
:AllFilesMode
Set /A Err=1
For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO Set /A Err=0 &Call :OutArc "%%d"
GoTo :End

:OneFileMode
Set "Name="
For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO Set "Name=%%d"
If "%Name%"=="" (Echo File or Folder not Found "%Src%\%Mask%" &Exit /B 1)

Call :OutArc "%Name%"
Set /A Err=%ErrorLevel%
:End
Popd

Exit /B %Err%

:OutArc
If Not Exist "%Dst%\%~1.*" (Echo "%Src%\%~1" &%Arc% "%Dst%\%~1.%Ext%" "%~1")
Exit /B

megaloman
07-11-2018, 10:01
последний оптимизированный батник перестал работать так, как он работал ранее и так, как мне было нужно. »здесь нет конкретики, что конкретно не так? @Echo Off
cls
Set "Src=Z:\Box_In\Мой контент\Книги"
Set "Mask=File_2018-10-??_Original."

Set /A Mode=1 &Rem 1= 1 файл/папка, 0=все файлы/папки по маске

Set "DirKey=/O:-N" &Rem если выбирается один файл/папка, то выберется самый последний по алфавиту

Set "Dst=Z:\Книги.arc"
Set "Log=%Dst%\%~nx0.log" &Rem Путь к лог-файлу. Можно указать в любом доступном месте с любым именем.

Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -dh -m3 -s -rr5p -ts+ -y
Set "Ext=rar"

Pushd "%Src%" || (Set MSG=Folder not Found "%Src%" &Set /A Err=2 &GoTo :End)
If Not Exist "%Dst%" Md "%Dst%" || (Set MSG=Folder not Created "%Dst%" &Set /A Err=3 &GoTo :End)

Set /A Err=1

If %Mode%==0 For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO (Set /A Err=0 &Call :OutArc "%%d")
If %Mode%==1 For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO (Set /A Err=0 &Call :OutArc "%%d" &GoTo :End)

:End
Popd
If "%Err%"=="1" (Set MSG=File or Folder not Found "%Src%\%Mask%" %DirKey%)
If Not "%Err%"=="0" >>"%Log%" Echo %Date% %Time% %Msg%

pause
Exit /B %Err%

:OutArc
If Not Exist "%Dst%\%~1.*" (
>>"%Log%" Echo %Date% %Time% "%Src%\%~1"
%Arc% "%Dst%\%~1.%Ext%" "%~1"
)
Exit /B

UserX
07-11-2018, 18:23
megaloman, опробовал Ваш последний батник.
Что интересно - результат его работы в режиме Mode=0 (AllFilesMode) зависит от значения DirKey
То есть, в указанном режиме Mode=0 (AllFilesMode) при DirKey=/O:-N и DirKey=/O:N результаты работы в каталоге Dst существенно между собой различаются, хотя, по логике дел, они должны бы быть одинаковы. Если, конечно, я ничего не упускаю из вида.
Правильная, на мой взгляд, работа в режиме Mode=0 (AllFilesMode) достигается только в случае установки в команде Dir ключа прямой сортировки, т.е. при DirKey=/O:N.
Это, видимо, значит, что в режиме Mode=0 (AllFilesMode) от DirKey нужно вообще оказаться и явно устанавливать ключ прямой сортировки для Dir, т.е. /O:N.
С учётом изложенного, модифицированная версия полностью работающего батника, кажется наконец-то, обретает завершённый вид:


@Echo Off
cls
Set "Mask=File_2018-10-??_Original."

Set "Src=Z:\Box_In\Мой контент\Книги"
Set "Dst=Z:\Книги.arc"

Set "Log=%Dst%\%~nx0.log" &Rem Путь к лог-файлу. Можно указать в любом доступном месте с любым именем.

Set /A Mode=1 &Rem Mode=1 - один файл/папка по маске; Mode=0 - все файлы/папки по маске
Set "DirKey=/O:-N" &Rem если выбран режим один файл/папка (Mode=1), то выберется самый последний по алфавиту
Rem Set "DirKey=/O:N" &Rem если выбран режим один файл/папка (Mode=1), то выберется самый первый по алфавиту

Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -dh -m3 -s -rr5p -ts+ -y
Set "Ext=rar"

Pushd "%Src%" || (Set MSG=Folder not Found "%Src%" &Set /A Err=2 &GoTo :End)
If Not Exist "%Dst%" Md "%Dst%" || (Set MSG=Folder not Created "%Dst%" &Set /A Err=3 &GoTo :End)

Set /A Err=1

If %Mode%==0 For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B /O:N`) DO (Set /A Err=0 &Call :OutArc "%%d")
If %Mode%==1 For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO (Set /A Err=0 &Call :OutArc "%%d" &GoTo :End)

:End
Popd
If "%Err%"=="1" (Set MSG=File or Folder not Found "%Src%\%Mask%" %DirKey%)
If Not "%Err%"=="0" >>"%Log%" Echo %Date% %Time% %Msg%

rem pause
Exit /B %Err%

:OutArc
If Not Exist "%Dst%\%~1.*" (
>>"%Log%" Echo %Date% %Time% "%Src%\%~1"
%Arc% "%Dst%\%~1.%Ext%" "%~1"
)
Exit /B

Посмотрите, пожалуйста.

megaloman
07-11-2018, 18:58
Что интересно - результат его работы в режиме Mode=0 (AllFilesMode) зависит от значения DirKey
То есть, при DirKey=/O:-N и DirKey=/O:N результаты работы в каталоге Dst существенно между собой отличаются, хотя, по логике дел, они должны бы быть одинаковы. Если, конечно, я ничего не упускаю.
Правильная, на мой взгляд, работа в режиме Mode=0 (AllFilesMode) достигается только в случае установки в команде Dir ключа прямой сортировки, т.е. при DirKey=/O:N. »- категорически с Вами не согласен.Cущественно между собой отличаются - это как? Только по времени (порядку) создания архивов. В этом режиме ключ сортировки вообще не имеет значения на количество и номенклатуру созданных архивов. Можете его вообще сделать пустым или убить - по умолчанию Dir выдаёт прямую алфавитную сортировку (если иное не прописано в системе). Он был оставлен только для единообразия цикла. Я протестировал. Убедился. Что-то Вы при тестировании делаете некорректно. Например, не удаляете упакованные после предыдущего тестирования файлы. Пересчитайте кол-во архивов (можете в лог-файле) и убедитесь в совпадении. Посмотрите в лог-файле список упакованных файлов при прямой сортировке и обратной. Они отличаются только обратным порядком.
Дело Ваше. (1.)Клиент всегда прав. (2.)Если клиент не прав, смотри (1.) Успехов!

PS. Обратите внимание, что в посте #18 для одного файла выбирается последний в списке Dir файл, а в постах #23, #26 выбирается первый. Вот тут и имеет значение /O:N в старых вариантах и /O:-N в последних вариантах.

UserX
07-11-2018, 20:13
- категорически с Вами не согласен.» Я веду речь только об одном конкретном режиме, а именно о режиме с установленным Set /A Mode=0 (то есть, если установлен режим всех файлов по заданной маске).
В этом одном режиме результаты работы батника в папке Dst при "SetKey=/O:N" и "SetKey=/O:-N" могут получиться совершенно разные. Но я вполне допускаю, что при некоторых вариантах маски эти результаты могут быть и совершенно идентичными.
Но разве результаты работы сами по себе не является реальностью? Я ведь эти резульаты работы никак не подтасовывал и не пытался ввести Вас в заблуждение. С чем тут можно соглашаться или не соглашаться?
Меня и самого это удивило. Но факт есть факт, вне зависимости от того, согласен ли кто угодно с ним или нет.

Cущественно между собой отличаются - это как»
Отличаются самими архивами (что из файлов/папок из Src запаковывается в Dst) и их количеством (сколько файлов/папок из Src запаковывается в Dst).

Что-то Вы при тестировании делаете некорректно. Например, не удаляете упакованные после предыдущего тестирования файлы.»
Нет, перед каждым тестом я каждый раз полностью очищал содержимое папки Dst.
Да и как такое возможно - "сделать некорректное тестирование"? По-моему, тестирование не может быть корректным или некорректным. Оно может быть просто тестированием.

Готов выложить Вам примерное содержимое папки Src, которое в режиме с установленным режимом Set /A Mode=0 (то есть, если установлен режим всех файлов по заданной маске), даёт разные результаты в папке Dst по количеству и видам созданных архивов при изменении ключа сортировки в Dir c прямого на обратный, чтобы вы смогли лично в этом убедиться.
Выложить свой тест?

UserX
07-11-2018, 20:47
Ключи:
Set /A Mode=0
Set "Mask=??10??.*"


Содержимое папки C:\111\Src

07.11.2018 20:41 <DIR> .
07.11.2018 20:41 <DIR> ..
05.11.2018 19:03 <DIR> 181027
05.11.2018 02:39 <DIR> 181028
01.10.2018 10:07 474 940 181028.jpg
05.11.2018 18:52 <DIR> 181029
01.10.2018 10:07 474 940 181029.jpg
05.11.2018 19:21 <DIR> 181030
01.10.2018 10:07 474 940 181030.jpg
05.11.2018 19:04 <DIR> 181103
01.10.2018 10:07 474 940 181103.jpg
4 файлов 1 899 760 байт
7 папок 4 155 273 216 байт свободно



Содержимое папки C:\111\Dst

07.11.2018 20:54 <DIR> .
07.11.2018 20:54 <DIR> ..
07.11.2018 20:53 11 316 072 181027.rar
07.11.2018 20:53 486 766 181028.jpg.rar
07.11.2018 20:53 1 270 083 181028.rar
07.11.2018 20:53 486 766 181029.jpg.rar
07.11.2018 20:53 11 316 072 181029.rar
07.11.2018 20:53 486 766 181030.jpg.rar
07.11.2018 20:53 11 316 072 181030.rar
7 файлов 36 678 597 байт
2 папок 4 165 160 960 байт свободно



Содержимое папки C:\111\Dst

07.11.2018 20:49 <DIR> .
07.11.2018 20:49 <DIR> ..
07.11.2018 20:46 11 316 072 181027.rar
07.11.2018 20:46 486 766 181028.jpg.rar
07.11.2018 20:46 486 766 181029.jpg.rar
07.11.2018 20:46 486 766 181030.jpg.rar
4 файлов 12 776 370 байт
2 папок 4 189 036 544 байт свободно

UserX
07-11-2018, 21:14
Это сообщение посчитали полезным следующие участники:
megaloman Ну, слава Богу! Мне удалось не обмануть Ваших ожиданий. :)

Спасибо Вам за всю проделанную Вами работу и за Ваше долготерпение, которое Вы проявили к оппоненту, несмотря ни на что.
Удачи Вам!

megaloman
07-11-2018, 22:35
UserX, чтобы при наличии в каталоге Dst архивов (*.rar, *.zip, *.7z и пр.) »
Хаос в данных == непредсказуемому результату.
При анализе наличия архива по маске Файл.* получим соответствие с Файл.jpg.*=Файл.* с ключом /O:-N
Гарантировать, что при ключе /O:N не получится еще какой-нибудь непредсказуемый пропуск, не берусь.
Чтобы результат был предсказуем (работа батника надежнее),то:

Либо считаем, что все архивы имеют расширение %Ext% (в нашем случае Rar), тогда исправление::OutArc
If Not Exist "%Dst%\%~1.%Ext%" (
@Echo Off
cls
Set "Src=Z:\Box_In"
Set "Mask=??10??.*"

Set /A Mode=0 &Rem 1= 1 файл/папка, 0=все файлы/папки по маске

Set "DirKey=/O:-N" &Rem /O:-N если выбирается один файл/папка, то выберется самый последний по алфавиту

Set "Dst=Z:\Книги.arc"
Set "Log=%Dst%\%~nx0.log" &Rem Путь к лог-файлу. Можно указать в любом доступном месте с любым именем.

Set Arc="C:\Program Files\WinRar\WinRar.exe" a -r -dh -m3 -s -rr5p -ts+ -y
Set "Ext=rar"

Set "AllExt=rar zip 7z arc"

Pushd "%Src%" || (Set MSG=Folder not Found "%Src%" &Set /A Err=2 &GoTo :End)
If Not Exist "%Dst%" Md "%Dst%" || (Set MSG=Folder not Created "%Dst%" &Set /A Err=3 &GoTo :End)

Set /A Err=1

If %Mode%==0 For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO (Set /A Err=0 &Call :OutArc "%%d")
If %Mode%==1 For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B %DirKey%`) DO (Set /A Err=0 &Call :OutArc "%%d" &GoTo :End)

:End
Popd
If "%Err%"=="1" (Set MSG=File or Folder not Found "%Src%\%Mask%" %DirKey%)
If Not "%Err%"=="0" >>"%Log%" Echo %Date% %Time% %Msg%

pause
Exit /B %Err%

:OutArc
FOR %%e IN (%AllExt%) DO If Exist "%Dst%\%~1.%%~e" Exit /B 0

>>"%Log%" Echo %Date% %Time% "%Src%\%~1"
%Arc% "%Dst%\%~1.%Ext%" "%~1"
Exit /B 0
И вааще, смесь файлов/папок с одинаковыми именами и разными расширениями может дать неожиданный результат при любых алфавитных сортировках даже при отборе 1 файла с маской с расширением .*
Удалите в Вашем наборе папку 181027 и, в зависимости от ключа сортировки, будете иметь
или 181028.rar или 181030.jpg.rar
Так что при смеси кони/люди (файлы/папки c одинаковыми именами, но разными расширениями) откажитесь от маски с расширением .* и используйте только жестко определённое расширение.

UserX
07-11-2018, 23:59
И вааще, смесь файлов/папок с одинаковыми именами и разными расширениями может дать неожиданный результат »
Я попробовал давать Вашему батничку на съедение весьма изощрённый наборчик ядрёной смеси. И он на ура справился со всем разнообразием, которое я ему подсовывал. При этом я всегда получал от него те результаты работы, которые и надеялся получить.
То есть, Ваш батник с честью выдержал все мои корявые тесты и ни разу не подвёл и не обманул моих ожиданий.
Единственное, я ещё раз хочу настоятельно уточнить, что в строке, касающейся прохождения проверки, что установлен режим Mode==0, я явно задаю прямое направление сортировки команды Dir ключом /O:N, т.е. я изменил одну Вашу строку в исходнике так (выделено жирным):
If %Mode%==0 For /F "usebackq delims=" %%d IN (`2^>nul Dir "%Src%\%Mask%" /B /O:N`) DO (Set /A Err=0 &Call :OutArc

И это принципиально для получения правильного результата работы батника при хаосе в каталоге Src.

Что же касается мешанины в каталоге Src, так она специально и создавалась таковой для тестирования. В реалии у меня такого бардака в Src, конечно же, нет. Но ведь проверить-то было нужно! :)
Считаю, что правильно написанная програма справляется со всеми вариантами, что, собственно, и продемонстрировал написанный Вами батник.

megaloman
08-11-2018, 00:10
UserX, Лог-файл создаётся? Путь к нему указан правильно? Я получил аналогичный результат, когда указал кривой путь к лог-файлу

правильно написааня программка справляется со всеми вариантами »Один из столпов программирования утверждал: всегда можно подобрать данные, способные одурачить программу

UserX
08-11-2018, 01:00
Лог-файл создаётся? »
Чёрт подери, я же у себя поменял Ваш параметр Log на LogFile, да во втором варианте позабыл его везде поправить.
Сейчас поправил, и всё прекрасно заработало.
Извините меня, пожалуйста, за невнимательность и ложную тревогу. :(

Собственно, почему я переименовал Log в LogFile. Хотел ещё ввести у себя параметр Log, типа:
Set "Log=Yes"
для того, чтобы вставить проверку - создавать или нет log-файл. Да что-то в моих неумелых руках не задалось... :)

Iska
08-11-2018, 02:32
по умолчанию Dir выдаёт прямую алфавитную сортировку »
Неа. Что возвращает функция WinAPI FindFirstFile/FindNextFile, то и выдаёт. Просто на NTFS записи каталога уже упорядочены по именам-расширениям. А для FATx это не так:
https://i.imgur.com/ugpuyPW.png
— там имена возвращаются в порядке создания записей каталога.

UserX
08-11-2018, 02:59
— там имена возвращаются в порядке создания записей каталога. »Ёпрст! Получается, что ключ сортировки по имени (/o:n) у команды Dir просто не работает?
Как же так? Ведь это же хаос какой-то! Ну, по умолчанию - ладно. Что там Dir выдаёт по умолчанию известно только ей, хотя, да, я ещё помню, что в fat32 командой Dir по умолчанию выдаются имена в порядке их создания.
Но ведь если явно указан ключ сортировки, то почему он не работает??
Я не понимаю...

Iska
08-11-2018, 03:06
Ёпрст! Получается, что ключ сортировки по имени (/o:n) у команды Dir просто не работает? »
Работает.

хотя, да, я помню,ещё что в fat32 командой Dir по умолчанию выдаются имена в порядке их создания. »
Именно так. Об этом я и написал.

Но ведь если явно указан ключ сортировки, то почему он не работает?? »
Работает.

Неверным является только одно предположение — что по умолчанию (в случае отсутствия параметра /o, отсутствия переменной окружения DIRCMD, отсутствия в содержимом переменной окружения DIRCMD параметра /o) команда dir возвращает имена-расширения файлов и каталогов из оглавления каталога в лексикографическом порядке. Это не так.

UserX
08-11-2018, 17:38
Работает. » Действительно работает. Я просто был невнимателен. Извините, пожалуйста.




© OSzone.net 2001-2012