2013-12-10 3 views
16

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

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

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

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

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

+0

является 'каталог y' в Мастер-справочнике? – Monacraft

+2

это можно сделать без внешних инструментов - https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders-with-batch-f – npocmaka

ответ

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

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

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

+0

Пробовал ли он до или после включения этой линии ECHO? – erm3nda

+0

Оба способа. Вы видите проблему? – Magoo

+0

Да, но, возможно, это потому, что я использовал zip.exe из cygwin. Я набираю zip на mi Win7 cmd в первый раз на своем live ... и ничего не делает ... поэтому я получил cygwin. Используя @monacraft, я понял, что a.zip не сравнивается с $ a etcetc. Я не знаю, что делает ~ n ... Мне не нужно, чтобы он выполнял то же самое. Используя ваш скрипт, я получил, что \ * \ является dos-style, предлагает использовать posix/* /, а также ту же проблему сравнения между именем varname и filename. Я могу опубликовать полное сообщение об ошибке, если вам интересно. – erm3nda

0

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

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

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

Mona.

+0

Сделайте вы попробуете это? я могу сказать вам :) – erm3nda

5

Ты рядом :)

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

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

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

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

Объяснение: for /d ..., что соответствует любой папки внутри. Только папка игнорирует файлы. (используйте для/f для filesmatch) 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 - это почтовый индекс. Вы можете попробовать с myzip.zip, но если это произойдет, потому что если у вас есть две или более папки, вторая не может дать имя первой и не будет пытаться перезаписать без дополнительных параметров. Итак, мы передаем% d для обоих, для которых имя текущей итерационной папки заносится в файл с именем папки. Не нужно добавлять «.zip», чтобы назвать.

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

+0

Разве вы не используете '-rp'? В противном случае будут дублироваться дубликаты имен файлов, не так ли? – ixe013

+0

, как вы говорите, когда пытаетесь добавить одинаковые имена файлов, столкнутся, но ... мы получаем реальные файлы из реальных папок. Нет дубликата имени файла. Мы помещаем содержимое каждой подпапки в почтовый индекс, названный как папка. Без коллизии. Я пытаюсь с реальными папками в мою систему, когда начинаю писать :) – erm3nda

+0

Спасибо всем за ответы и спасибо erm3nda за подробное объяснение. Все это помогло мне. Еще раз спасибо. – user3085265

8

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

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

здесь * является текущая папка. для больше возможностей попробовать this link

4

Никакой внешней зависимости от 7zip или ZIP - создать VBS скрипт и выполнить:

@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 
+0

Знаете ли вы, что это будет работать на компьютере под управлением Windows XP? – user95227

0

Это link по Tomas имеет хорошо написанный сценарий для пронестись содержимым папки.

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

Нет необходимости упоминать каталог назначения, как это по умолчанию в сценарии на рабочий стол («% USERPROFILE% \ Desktop»)

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

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

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

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

Простая процедура заключается в следующем:

Одна установка времени:

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

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

  3. добавьте ниже, к окружающей среде PATH «C: \ Program Files \ 7-Zip»

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

  1. Создайте файл с именем 'build.bat', с ниже cotents:

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

Это все

Примечание: команда выше «7z», рекурсивно пронестись (или архивы или) все содержимое текущей папки, и создает файл с именем mycurrentfolder.zip

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