Ответ 1
for /d %%a in (*) do (ECHO zip -r -p "%%~na.zip" ".\%%a\*")
должен работать из пакета.
Обратите внимание, что я включил ECHO
, чтобы просто ПОКАЗАТЬ предлагаемую команду. Вам нужно будет удалить ключ ECHO
, чтобы ВЫПОЛНИТЬ команды.
У меня есть структура папок в этом шаблоне. Я только что показал два подкаталога и 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"
, но она работает только в том случае, если файлы находятся прямо там без подпапок.
for /d %%a in (*) do (ECHO zip -r -p "%%~na.zip" ".\%%a\*")
должен работать из пакета.
Обратите внимание, что я включил ECHO
, чтобы просто ПОКАЗАТЬ предлагаемую команду. Вам нужно будет удалить ключ ECHO
, чтобы ВЫПОЛНИТЬ команды.
Я знаю его слишком поздно, но если вы все еще хотите попробовать
for /d %%X in (*) do (for /d %%a in (%%X) do ( "C:\Program Files\7-Zip\7z.exe" a -tzip "%%X.zip" ".\%%a\" ))
здесь * - текущая папка. для дополнительных опций попробуйте эту ссылку
Вы рядом:)
Во-первых, пакет (переменная %%) и 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", чтобы назвать.
Довольно коротко, чем я ожидал, когда начинаем играть.
Нет внешней зависимости от 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
Это правильный синтаксис для архивирования отдельных; папки в пакете в виде отдельных файлов с zip файлами...
for /d %%X in (*) do "c:\Program Files\7-Zip\7z.exe" a -mx "%%X.zip" "%%X\*"
Простая процедура такова:
Настройка времени:
Отсюда: 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
Попробуйте этот код:
for /d %%a in (*) do (zip "%%~na.zip" "%%a")
Этот код должен запускаться из пакетного (.bat) файла.
Мона.
Это 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