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" ? Или это делается как-то однократно в самом начале батника?
Вообще, что, на Ваш взгляд, имело бы смысл подправить в синтаксисе батника при его использовании в задании Шедулера?