Посмотрите на этом комментировали код партии:
@echo off
for /D %%I in ("D:\folder\*") do (
if exist "%%I\%%~nxI.zip" (
if exist "%%I\opt\%%~nxI.zip" (
call :CompareFiles "%%I\%%~nxI.zip" "%%I\opt\%%~nxI.zip"
)
)
)
goto :EOF
rem The loop runs on each subdirectory of directory D:\folder. It first
rem checks if there is a *.zip file in the subdirectory with same name as
rem the subdirectory. Next it checks if in the current subdirectory there
rem is a subdirectory with name "opt" with having also a *.zip file with
rem same name as the subdirectory. If this second condition is also true,
rem the subroutine CompareFiles is called with the names of the 2 ZIP files.
rem The subroutine compares the file size of the two ZIP files.
rem The optimized ZIP file is moved over the ZIP file in directory
rem above if being smaller than the ZIP file in directory above.
rem Otherwise the optimized ZIP file being equal or greater as the
rem ZIP file above is deleted.
rem Finally the subdirectory "opt" is deleted which works only if the
rem subdirectory is empty. The error message output by command RD in
rem case of "opt" is not empty is redirected from STDERR to device NUL
rem to suppress it.
rem goto :EOF above results in exiting processing this batch file after
rem finishing the loop and avoids a fall through to the subroutine. The
rem goto :EOF below would not be really necessary as it is at end of the
rem batch file. But it is recommended to end each subroutine with goto :EOF
rem or alternatively exit /B in case of one more subroutine is added later.
:CompareFiles
if %~z1 GTR %~z2 (
move /Y %2 %1
) else (
del /F %2
)
rd "%~dp2" 2>nul
goto :EOF
Вы можете проверить командный файл, вставив команду echo
слева команды move
и del
и запустить пакетный файл из в окне командной строки, чтобы увидеть выход. Когда результат будет таким, как ожидалось, запустите пакетный файл еще раз без двух добавленных echo
.
ВНИМАНИЕ:
командный процессор для Windows поддерживает только подписанные 32-битные целые числа. Таким образом, этот пакетный код не работает для файлов ZIP с 2 гигабайтами (= 2.147.483.650 байт) или более.
%%~nxI
Обычно ссылки обычно включают имя файла и расширение файла. Командный процессор Windows интерпретирует все после последней обратной косой черты как имя файла или каталога. Здесь строка, назначенная переменной цикла I
, является именем поддиректории с приводом и адресом D:\folder\
, не заканчивающимся обратным слэшем. По этой причине %%~nI
ссылается на имя текущего подкаталога в D:\folder\
. Расширение файла определяется как все после последней точки. Каталоги обычно не имеют точки в имени каталога и поэтому %%~nI
часто также достаточно для имени каталога. Но можно создавать каталоги также с точкой в имени каталога. Поэтому использование %%~nxI
более безопасно для работы с любым именем каталога.
Примечание: подкаталогов со скрытым или системным атрибутом игнорируется командой FOR.
Это 100% безопасно использовать только %1
и %2
в подпрограмме CompareFiles
вместо "%~1"
и "%~2"
как оба имен файлов должны быть передан уже заключен в двойных кавычках подпрограммы на сдерживание пробела или один из этих символов: &()[]{}^=;!'+,`~
. Поэтому с точки зрения исполнения не имеет смысла указывать на move
и del
аргументы (имена файлов) с "%~1"
и "%~2"
. Но, конечно, можно использовать "%~1"
и "%~2"
, например, для улучшения подсветки синтаксиса в текстовом редакторе или для ссылок на имена файлов в форме, переданных в качестве аргументов в пакетный файл или подпрограмму.
Пакетный файл может быть упрощен при не тестировании, если оба ZIP-файла существуют вообще, а оптимизированный ZIP-файл действительно меньше.
@echo off
for /D %%I in ("D:\folder\*") do (
move /Y "%%I\opt\%%~nxI.zip" "%%I\%%~nxI.zip" 2>nul
rd "%%I\opt" 2>nul
)
Ошибка вывод сообщения в случае оптимизированной ZIP файла не существует подавлен, перенаправив его на устройство NUL.
Чтобы понять используемые команды и как они работают, откройте окно командной строки, выполните там следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.
call /?
del /?
echo /?
for /?
goto /?
if /?
move /?
rd /?
См. Также статью Microsoft Using command redirection operators для получения более подробной информации о 2>nul
.
Пожалуйста, покажите нам, что вы пробовали до сих пор! В противном случае это не вопрос [по-теме] (http://stackoverflow.com/help/on-topic), а запрос задачи, который является [вне темы] (http://stackoverflow.com/help/ dont-ask) здесь. Подсказка: проверьте ['for' loop] (http://ss64.com/nt/for.html) ... – aschipfl
Извините, я сломал все это, потому что я злюсь – Lee