2016-12-12 4 views
0

У меня есть структура папок, как показано ниже:Пакетный сценарий, чтобы очистить пространство для хранения

  • D: \ папку
    • test1
      • неавтоматического
        • test1.zip (10 МБ)
      • test1.zip (100 МБ)
    • test2
      • неавтоматического
        • test2.zip (10 МБ)
      • test2.zip (100 МБ)
    • test3
      • неавтоматического
        • test3.zip (10 МБ)
      • test3.zip (100 MB)

Одинаковые файлы в виде плоского списка:

D:\folder\test1\test1.zip 
D:\folder\test1\opt\test1.zip 
D:\folder\test2\test2.zip 
D:\folder\test2\opt\test2.zip 
D:\folder\test3\test3.zip 
D:\folder\test3\opt\test3.zip 

У меня есть сценарий, который оптимизирует файлы почтового индекса. То, что мне нужно сделать в пакетном файле, - это в основном найти эти оптимизированные файлы в папках opt и перезаписать более крупную версию с меньшим.

+0

Пожалуйста, покажите нам, что вы пробовали до сих пор! В противном случае это не вопрос [по-теме] (http://stackoverflow.com/help/on-topic), а запрос задачи, который является [вне темы] (http://stackoverflow.com/help/ dont-ask) здесь. Подсказка: проверьте ['for' loop] (http://ss64.com/nt/for.html) ... – aschipfl

+0

Извините, я сломал все это, потому что я злюсь – Lee

ответ

0

Посмотрите на этом комментировали код партии:

@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.

+0

Вместо' move/Y% 2% 1 'и' del/F% 2', я рекомендую вместо этого написать 'move/Y '% ~ 2" "% ~ 1" 'и' del/F "% ~ 2" '(я знаю, что это не измените что-нибудь в этой конкретной ситуации) ... – aschipfl

+0

, который звучит потрясающе, мне тоже нравится делать, где большой файл содержит имя файла меньшего файла (не то же самое, что и выше) – Lee

Смежные вопросы