Пакетный файл script для zip файлов

У меня есть структура папок в этом шаблоне. Я только что показал два подкаталога и 2 файла в каждом, но обычно у меня есть n поддиректорий на одном уровне и один уровень файлов (но может быть n количество файлов) под ними.

Directory master
subDirectory x:
  file1
  file2
Directory y:
  file 3
  file 4

Мне нужно создать Windows script, пакетный файл для запуска из главного каталога и дать мне два zip файла x.zip и y.zip, содержащие их соответствующие файлы.

Я знаю, что мой script должен использовать команды for и zip, но я собираюсь запугивать, пытаясь заставить его работать, поскольку я не могу понять из синтаксиса этих команд и googling, похоже, не помогает.

Я нашел команду, подобную этой for %f in ("*.*") do zip "%~nf.zip" "%f", но она работает только в том случае, если файлы находятся прямо там без подпапок.

Ответы

Ответ 1

for /d %%a in (*) do (ECHO zip -r -p "%%~na.zip" ".\%%a\*")

должен работать из пакета.

Обратите внимание, что я включил ECHO, чтобы просто ПОКАЗАТЬ предлагаемую команду. Вам нужно будет удалить ключ ECHO, чтобы ВЫПОЛНИТЬ команды.

Ответ 2

Я знаю его слишком поздно, но если вы все еще хотите попробовать

for /d %%X in (*) do (for /d %%a in (%%X) do ( "C:\Program Files\7-Zip\7z.exe" a -tzip "%%X.zip" ".\%%a\" ))

здесь * - текущая папка. для дополнительных опций попробуйте эту ссылку

Ответ 3

Вы рядом:)

Во-первых, пакет (переменная %%) и Windows CMD (% variable) используют разные имена переменных. Во-вторых, я не понимаю, как вы используете zip из CMD. Я думаю, это от пользователей Linux. Использовать встроенную почтовую манипуляцию не так легко, как Win, и еще сложнее с пакетным сценарием.

Но тебе все равно повезло. Я получил (извлечен в целевую папку) zip.exe и cygwin1.dll из пакета cygwin (размером 3 МБ вместе) и начните играть с ним прямо сейчас.

Конечно, я использую CMD для лучшего/более быстрого тестирования, а не партии. Только помните, чтобы модифицировать% varname до %% varname, прежде чем обвинить меня: P

for /d %d in (*) do zip -r %d %d

Объяснение: for /d ..., который соответствует любой папке внутри. Только папка игнорирует файлы. (используйте для /f для файлов) for /d %d in ...% d сообщает cmd, имя которого вы хотите присвоить своей переменной. Я помещаю d для соответствия widh d (значение каталога). for /d %d in (*) ... Очень важно. Это означает, что я CD в нужную папку или запустил. (*) это будет означать все в этом каталоге, потому что мы используем /d, файлы не обрабатываются, поэтому нет необходимости устанавливать шаблон, даже если вы можете получить только некоторые папки, если вам нужно. Вы можете использовать абсолютные пути. Не уверены в проблемах с родственниками из партии. for /d %d in (*) do zip -r ... Устанавливается ли ZIP. (сам exec zip и см. экран справки, чтобы использовать ваши пользовательские правила). r - для рекурсивного, поэтому будет добавлен anyting. for /d %d in (*) do zip -r %d %d Первый% d - это zip-имя. Вы можете попробовать с myzip.zip, но если это произойдет, потому что если у вас есть две или более папки, вторая не может дать имя первой и не будет пытаться перезаписать без дополнительных параметров. Итак, мы передаем% d для обоих, для которых имя текущей итерационной папки заносится в файл с именем папки. Не нужно добавлять ".zip", чтобы назвать.

Довольно коротко, чем я ожидал, когда начинаем играть.

Ответ 4

Нет внешней зависимости от 7zip или ZIP - создайте vbs script и выполните:

    @ECHO Zipping
    mkdir %TEMPDIR%
    xcopy /y /s %FILETOZIP% %TEMPDIR%
    echo Set objArgs = WScript.Arguments > _zipIt.vbs
    echo InputFolder = objArgs(0) >> _zipIt.vbs
    echo ZipFile = objArgs(1) >> _zipIt.vbs
    echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
    echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
    echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
    echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
    @ECHO *******************************************
    @ECHO Zipping, please wait..
    echo wScript.Sleep 12000 >> _zipIt.vbs
    CScript  _zipIt.vbs  %TEMPDIR%  %OUTPUTZIP%
    del _zipIt.vbs
    rmdir /s /q  %TEMPDIR%

    @ECHO *******************************************
    @ECHO      ZIP Completed

Ответ 5

Это правильный синтаксис для архивирования отдельных; папки в пакете в виде отдельных файлов с zip файлами...

for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a -mx "%%X.zip" "%%X\*"

Ответ 6

Простая процедура такова:

Настройка времени:

  • Отсюда: http://www.7-zip.org/download.html, загрузите 7zip exe (либо 32-разрядный x86, либо 64-разрядный x64, основанный на вашей компьютерной архитектуре).

  • Установите его скажем, установка переходит к "C:\Program Files\7-Zip" то есть вы увидите "7z.exe"

  • ПРИЛОЖИТЕ ниже, к среде PATH "C:\Program Files\7-Zip"

Zip рекурсивный

  • Создайте файл с именем 'build.bat', с нижеследующими коментами:

     REM  build.bat
     7z a mycurrentfolder.zip
    
  • Поместите этот файл "build.bat" в любую папку и дважды щелкните его, чтобы запустить его.

Что все

ПРИМЕЧАНИЕ. Выше '7z' команда, рекурсивно zip (или архивы или а) все содержимое текущей папки и создает файл с именем mycurrentfolder.zip

Ответ 7

Попробуйте этот код:

for /d %%a in (*) do (zip "%%~na.zip" "%%a")

Этот код должен запускаться из пакетного (.bat) файла.

Мона.

Ответ 8

Это Tomas имеет хорошо написанный script для zip-содержимого папки.

Чтобы заставить его работать, скопируйте script в пакетный файл и запустите его, указав папку, которая будет заархивирована (источник).

Не нужно упоминать каталог назначения, поскольку он по умолчанию используется в script для рабочего стола ( "% USERPROFILE%\Desktop" )

Копирование script здесь, просто отключите веб-ссылку:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

SET sourceDirPath=%1
IF [%2] EQU [] (
  SET destinationDirPath="%USERPROFILE%\Desktop"
) ELSE (
  SET destinationDirPath="%2"
)
IF [%3] EQU [] (
  SET destinationFileName="%~n1%.zip"
) ELSE (
  SET destinationFileName="%3"
)
SET tempFilePath=%TEMP%\FilesToZip.txt
TYPE NUL > %tempFilePath%

FOR /F "DELIMS=*" %%i IN ('DIR /B /S /A-D "%sourceDirPath%"') DO (
  SET filePath=%%i
  SET dirPath=%%~dpi
  SET dirPath=!dirPath:~0,-1!
  SET dirPath=!dirPath:%sourceDirPath%=!
  SET dirPath=!dirPath:%sourceDirPath%=!
  ECHO .SET DestinationDir=!dirPath! >> %tempFilePath%
  ECHO "!filePath!" >> %tempFilePath%
)

MAKECAB /D MaxDiskSize=0 /D CompressionType=MSZIP /D Cabinet=ON /D Compress=ON /D UniqueFiles=OFF /D DiskDirectoryTemplate=%destinationDirPath% /D CabinetNameTemplate=%destinationFileName%  /F %tempFilePath% > NUL 2>&1

DEL setup.inf > NUL 2>&1
DEL setup.rpt > NUL 2>&1
DEL %tempFilePath% > NUL 2>&1