smarth 发表于 2021-9-22 12:01

[7zip批量压缩][bat脚本] 命令行操作 7zip (附脚本)

本帖最后由 smarth 于 2021-9-22 13:36 编辑

## 前言

### 更新

本脚本适用于批量压缩解压缩, 比如我前段时间爬了海贼王漫画, 1000多话,以每话为单位压缩。

如果想用命令压缩单个文件的话可以将`7z.exe`放入系统变量进入cmd使用命令

### 个人博客

首发于[个人博客](https://eastarpen.github.io/post/tools/operate-7zip-in-command-line/)

### 概述

用命令行操作7zip 实现批量压缩与解压缩

本文适用于windows, 理论上略作修改也可适配其他系统,但没必要(有更好选择)。

### 参考

[参考教程\(打不开挂代{过}{滤}理\)](https://www.dotnetperls.com/7-zip-examples)

### 原理

利用循环命令操作 `7z.exe` 文件,实现批量复制与解压缩


##命令介绍

### 命令详情

   在 7zip 安装目录下(含有 7z.exe 文件)输入 `7z` 可查看命令详情

   ```shell
      7-Zip 20.02 alpha (x64) : Copyright (c) 1999-2020 Igor Pavlov : 2020-08-08

      Usage: 7z <command> [<switches>...] <archive_name> [<file_names>...] [@listfile]

      <Commands>
          a : Add files to archive
          b : Benchmark
          d : Delete files from archive
          e : Extract files from archive (without using directory names)
          h : Calculate hash values for files
          i : Show information about supported formats
          l : List contents of archive
          rn : Rename files in archive
          t : Test integrity of archive
          u : Update files to archive
          x : eXtract files with full paths

      <Switches>
          -- : Stop switches and @listfile parsing
          -ai]{@listfile|!wildcard} : Include archives
          -ax]{@listfile|!wildcard} : eXclude archives
          -ao{a|s|t|u} : set Overwrite mode
          -an : disable archive_name field
          -bb : set output log level
          -bd : disable progress indicator
          -bs{o|e|p}{0|1|2} : set output stream for output/error/progress line
          -bt : show execution time statistics
          -i]{@listfile|!wildcard} : Include filenames
          -m{Parameters} : set compression Method
                -mmt : set number of CPU threads
                -mx : set compression level: -mx1 (fastest) ... -mx9 (ultra)
          -o{Directory} : set Output directory
          -p{Password} : set Password
          -r[-|0] : Recurse subdirectories
          -sa{a|e|s} : set Archive name mode
          -scc{UTF-8|WIN|DOS} : set charset for for console input/output
          -scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : set charset for list files
          -scrc : set hash function for x, e, h commands
          -sdel : delete files after compression
          -seml[.] : send archive by email
          -sfx[{name}] : Create SFX archive
          -si[{name}] : read data from stdin
          -slp : set Large Pages mode
          -slt : show technical information for l (List) command
          -snh : store hard links as links
          -snl : store symbolic links as links
          -sni : store NT security information
          -sns[-] : store NTFS alternate streams
          -so : write data to stdout
          -spd : disable wildcard matching for file names
          -spe : eliminate duplication of root folder for extract command
          -spf : use fully qualified file paths
          -ssc[-] : set sensitive case mode
          -sse : stop archive creating, if it can't open some input file
          -ssp : do not change Last Access Time of source files while archiving
          -ssw : compress shared files
          -stl : set archive timestamp from the most recently modified file
          -stm{HexMask} : set CPU thread affinity mask (hexadecimal number)
          -stx{Type} : exclude archive type
          -t{Type} : Set type of archive
          -u[-][!newArchiveName] : Update options
          -v{Size} : Create volumes
          -w[{path}] : assign Work directory. Empty path means a temporary directory
          -x]{@listfile|!wildcard} : eXclude filenames
          -y : assume Yes on all queries
   ```

### 关键命令

1. `a` 即 `add 或 archive`压缩命令

   `7z a example.7z test.txt` 可将当前目录下 test.txt 文件压缩到 example.7z 文件

2. `e` 即 extra 解压命令(会破坏压缩包文件结构)

3. `x` 即 eXtra 解压命令(保留压缩包文件结构)

4. `-p` 添加密码参数

   `7z a example.7z test.txt -p123456` 会将 test.txt 文件压缩到 example.7z 且密码为 `123456`

   `7z e example.7z -p123456` 使用密码`123456` 解压

## 脚本内容

### 一键压缩

   ```shell
    :: archive.bat

      @echo off
      for %%f in (*) do CALL :run %%f
      for /d %%d in (*) do CALL :run %%d

      :run
      echo %~1
      echo %~1|findstr ".bat" > nul && echo bat file || CALL :7zArchive %~1
      EXIT /B 0

      :7zArchive
      if not %~dnp1=="" (
                path a "%~dnp1.7z" %~1 -ppassword
      )
      EXIT /B 0
   ```

### 一键解压缩

   ```shell
         :: extra.bat

      for %%z in (*.7z, *.zip, *.rar) do path x %%z -ppassword
   ```

### 使用方法

1. 新建`extra.bat` 或 `archive.bat`, 将对应内容复制到对应文件内
2. 将脚本内path更改为`7z.exe`文件路径
   
   示例`C:\Program Files\7-Zip\7z.exe`

3. 默认设定密码为 `password` 可自行更改, 注意解压时密码匹配

smarth 发表于 2021-9-22 18:13

Natu 发表于 2021-9-22 16:59
感谢楼主分享批量压缩脚本思路,不过我更感兴趣的是论坛发帖时用到的“复制代码、隐藏代码”,能把“一键解 ...

你是对 markdown 语法感兴趣吗?

在发贴的时候选择插入markdown(应该是这个名字), 然后按照markdown语法输入内容就行了

你要的源码

## 脚本内容

### 一键压缩

   ```shell
    :: archive.bat

        @echo off
        for %%f in (*) do CALL :run %%f
        for /d %%d in (*) do CALL :run %%d

        :run
        echo %~1
        echo %~1|findstr ".bat" > nul && echo bat file || CALL :7zArchive %~1
        EXIT /B 0

        :7zArchive
        if not %~dnp1=="" (
                path a "%~dnp1.7z" %~1 -ppassword
        )
        EXIT /B 0
   ```

### 一键解压缩

   ```shell
           :: extra.bat

        for %%z in (*.7z, *.zip, *.rar) do path x %%z -ppassword
   ```

其中 ### 表示三级标题

`````` 包起来的内容会显示为代码块 ```shell``` 表示代码内容为shell语言

`` 这个也是显示代码的

其他markdown语法可以自行搜索学习

Natu 发表于 2021-9-23 08:32

smarth 发表于 2021-9-22 18:13
你是对 markdown 语法感兴趣吗?

在发贴的时候选择插入markdown(应该是这个名字), 然后按照markdown语 ...

谢谢您的回复,我现在用Joplin做笔记,以前做的笔记也都改用markdown语法保存。对markdown略有了解,论坛中的代码块很实用,得您指点已经弄明白了,采用如下语法结构就会自动生成代码块结构。

```C
代码内容
```

依佳人时代 发表于 2021-9-22 12:09

不会用谢谢原创

四君子 发表于 2021-9-22 12:18

牛逼6666666

Natu 发表于 2021-9-22 16:59

感谢楼主分享批量压缩脚本思路,不过我更感兴趣的是论坛发帖时用到的“复制代码、隐藏代码”,能把“一键解压缩”这一段的论坛源码给我分享一下吗?论坛帮助文件里边的我尝试过了,反复测试都不行,给版主发消息也没人回,楼主能抽空分享一下将不甚感激!{:1_893:}

Natu 发表于 2021-9-22 17:03

依佳人时代 发表于 2021-9-22 12:09
不会用谢谢原创

有DOS基础就对这个有兴趣,虽然windows发展很多年了,DOS解决这类批量处理还是很擅长的。

smarth 发表于 2021-9-22 18:08

Natu 发表于 2021-9-22 17:03
有DOS基础就对这个有兴趣,虽然windows发展很多年了,DOS解决这类批量处理还是很擅长的。

可以去研究一下 shell 脚本

同样是操作文件和系统, dos 只对windows起作用,shell则是适用于全平台(就算是windwos 也有power shell)

而且shell教程更多更全面

Natu 发表于 2021-9-22 21:32

smarth 发表于 2021-9-22 18:08
可以去研究一下 shell 脚本

同样是操作文件和系统, dos 只对windows起作用,shell则是适用于全平台( ...

谢谢,没有仔细研究过,遇到问题了才会去查资料搞研究,哈哈

Natu 发表于 2021-9-22 21:42

smarth 发表于 2021-9-22 18:13
你是对 markdown 语法感兴趣吗?

在发贴的时候选择插入markdown(应该是这个名字), 然后按照markdown语 ...

谢谢你,我已经学会了。

```shell
这仅仅是一个测试。
```

wi_xue2008 发表于 2021-9-22 23:14

谢谢分享
页: [1] 2
查看完整版本: [7zip批量压缩][bat脚本] 命令行操作 7zip (附脚本)