3

Мне нужно ежечасно сжимать определенную папку в Windows и перемещать ее в другую папку назначения. Как я могу это сделать?

4 ответа4

4

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

@echo off
cd folder
zip -9 -r Filename.zip *
echo Done.

Zip-переключатели:

  • -9 попыток лучшего сжатия
  • -r вызывает рекурсию каталога

Если вам нужно скопировать ресурсы или, например, дерево папок (как мне нужно было сделать), вы можете использовать xcopy для этого.

echo Copying resources to Release dir...
xcopy resources bin\Release\Resources /Y /E /I

Различные командные строки переключаются здесь:

  • вызвать автоматическую перезапись существующих файлов (/Y)
  • скопировать все папки, включая пустые (/E)
  • в основном позволяет копировать деревья каталогов (/I)

Надеюсь, это даст вам достаточно информации, чтобы вы могли настроить пакетный скрипт для себя. Затем, как уже говорили другие, вы можете использовать запланированные задачи, чтобы запускать скрипт ежечасно. Если у вас нет командной строки zip exe, я использую этот. Скопируйте его в C:\Windows\System32 и он должен быть доступен из всех пакетных сценариев.

Обновить

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

set timestamp=%date:~10,4%%date:~7,2%%date:~4,2%%time:~0,2%%time:~3,2%%time:~6,2%
ren OldZipFileName.zip %timestamp%.zip

Это переименует старый zip-файл в новый, в формате YYYYMMDDHHmmSS; год-месяц-день-час-минута-секунда. Если вы хотите добавить префикс или суффикс к имени файла, сделайте это до или после раздела %timestamp% , например:

ren OldZipFileName.zip build_%timestamp%_debug.zip

Обновите снова

Причина большой и громоздкой строки set timestamp=... заключается в том, что стандартные форматы %date% и %time% не являются лучшими для того, что мы хотим сделать. Если мы выведем их на консоль, чтобы посмотреть, как они выглядят нормально, мы получим нечто похожее на это:

> echo %date%
Sun 13/12/2009
> echo %time%
 2:53:31.60

Итак, мы используем причудливую функцию подстроки пакетных переменных, например: %variablename:~startindex,length% . Как вы можете видеть выше, вам нужно будет повторить это один раз для каждого сегмента, который вы хотите скопировать. Итак, в моем случае, чтобы получить выходное имя файла в формате ГГГГММДДЧЧММСС, мне нужно было скопировать три части из каждой из переменных %date% и %time% , используя подстроку. Соедините все эти части, и вы получите длинную очередь, которую я написал там ранее. Чтобы привести пример этих частей в отдельности:

> echo %date%
Sun 13/12/2009
> echo %date:~10,4%
2009
> echo %date:~7,2%
12

Надеюсь, что это поможет прояснить ситуацию для вас!

1

Я далек от Windows, но вот общая идея: просто следите за прошедшим временем в вашей программе и каждые 3600-х, используйте специфичные для сжатия вызовы библиотеки и примитивы, чтобы делать то, что вы хотите достичь.

1

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

1

Вы, вероятно, хотите использовать планировщик заданий. В Vista и 7 вы добираетесь до него, набирая taskschd.msc из диалога Run.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .