无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 2971|回复: 24
打印 上一主题 下一主题

[发布] 一个全盘compact压缩的powershell脚本

[复制链接]
跳转到指定楼层
1#
发表于 2023-12-25 16:21:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
习惯用dism命令加上参数/compact:LZX来安装系统,但是系统并不会将全部文件都以最高压缩比来压缩文件,所以最后全部设置完毕后只能强制以最高压缩比再压缩一次。既然是强制,那么先前已经是LZX压缩过的文件又被重新压缩了一次。而且由于windows里面硬链接文件众多,这就相当于有些文件被解压缩了多次。再加上有些文件大小小于磁盘的分配单元大小,那么即使压缩了也不会减少占用空间。这些因素都使得电脑做了不少无用功。
所以琢磨了一个脚本,用着还行,电脑少做了不少有害无益的无用功,对SSD也是一种减负。

将横线下面的代码保存为LZX.ps1运行。
-----------------------------------------------------------------------

$ErrorActionPreference = "Stop"

function Compress-Files {
    param(
        [Parameter(Mandatory = $true)]
        [string]$Path,
        [Parameter()]
        [int]$FileSize
    )

    $directories = @("Program Files", "Program Files (x86)", "Users", "ProgramData", "Windows")

    foreach ($directory in $directories) {
        Process-Directory "$Path\$directory" -FileSize $FileSize
    }

    Write-Host "文件压缩完成。"
    Start-Sleep -Seconds 3
}

function Process-Directory {
    param(
        [Parameter(Mandatory = $true)]
        [string]$DirectoryPath,
        [Parameter()]
        [int]$FileSize
    )

    Write-Host "处理目录:$DirectoryPath"

    Get-ChildItem -Recurse -File $DirectoryPath | ForEach-Object {
        $sourceFile = $_.FullName
        if ($FileSize -and $_.Length -gt $FileSize) {
            if (!(Compact "$sourceFile" | Select-String -Pattern "1 l")) {
                Compress-File "$sourceFile"
            }
        } elseif (!$FileSize) {
            if (!(Compact "$sourceFile" | Select-String -Pattern "1 l")) {
                Compress-File "$sourceFile"
            }
        }
    }
}

function Compress-File {
    param(
        [Parameter(Mandatory = $true)]
        [string]$FilePath
    )

    Write-Host "正在使用 LZX 压缩文件:$FilePath"
    Compact /C /F /A /I /EXE:LZX $FilePath

    if ($?) {
        Write-Host "文件压缩完成。"
    } else {
        Write-Host "文件压缩失败。"
        # 可以添加日志记录功能,将失败的文件记录到日志文件中
    }
}

$ImagePath = Read-Host "请输入要压缩的盘符(带冒号)"
$FileSize = Read-Host "请输入要筛选的文件最小大小(单位字节)"

if ([string]::IsNullOrWhiteSpace($ImagePath)) {
    Write-Host "输入为空,请重新输入。"
} elseif (![int]::TryParse($FileSize, [ref]$null) -or $FileSize -lt 0) {
    Write-Host "文件大小不正确,请重新输入一个大于等于零的数字。"
} else {
    Compress-Files -Path $ImagePath -FileSize $FileSize
}

点评

win8 可以用吗  发表于 2023-12-25 17:00
2#
发表于 2023-12-25 16:36:50 | 只看该作者
感谢分享  
回复

使用道具 举报

3#
发表于 2023-12-25 17:36:25 | 只看该作者
谢谢分享
回复

使用道具 举报

4#
 楼主| 发表于 2023-12-25 18:00:02 | 只看该作者
win8要添加compact支持包才能用
回复

使用道具 举报

5#
发表于 2023-12-25 18:14:25 | 只看该作者
看起来省点空间而已,反复压缩减负就未必了
回复

使用道具 举报

6#
发表于 2023-12-25 20:20:36 | 只看该作者
谢谢分享
回复

使用道具 举报

7#
发表于 2023-12-25 21:14:49 | 只看该作者
谢谢分享
回复

使用道具 举报

8#
发表于 2023-12-25 22:54:49 | 只看该作者
赞,谢谢分享。
回复

使用道具 举报

9#
发表于 2023-12-26 05:00:00 | 只看该作者
感谢分享
回复

使用道具 举报

10#
发表于 2023-12-26 06:45:29 | 只看该作者
赞,谢谢分享。
回复

使用道具 举报

11#
发表于 2023-12-26 14:30:08 | 只看该作者
感谢分享
回复

使用道具 举报

12#
发表于 2023-12-26 17:51:47 | 只看该作者
谢谢分享
回复

使用道具 举报

13#
发表于 2023-12-28 15:35:41 | 只看该作者
感谢分享
回复

使用道具 举报

14#
发表于 2023-12-29 03:32:15 | 只看该作者
感谢分享
回复

使用道具 举报

15#
发表于 2024-1-15 16:31:44 | 只看该作者
多谢提供分享!
回复

使用道具 举报

16#
发表于 2024-1-18 10:28:33 | 只看该作者
本帖最后由 jlshnlhj 于 2024-1-24 16:21 编辑

支持哪些Windows版本?Win10,Win11?
回复

使用道具 举报

17#
发表于 2024-1-28 15:22:35 | 只看该作者
谢谢分享
回复

使用道具 举报

18#
发表于 2024-1-28 19:58:45 | 只看该作者
谢谢分享
回复

使用道具 举报

19#
发表于 2024-1-29 11:06:36 | 只看该作者
谢谢分享
回复

使用道具 举报

20#
发表于 2024-1-29 11:16:24 | 只看该作者
留名,看个标题就走了
回复

使用道具 举报

21#
发表于 2024-1-29 13:05:36 | 只看该作者
貌似还不够十五字,我只是来打酱油的
回复

使用道具 举报

22#
发表于 2024-1-29 13:20:55 | 只看该作者
compact压缩相比refsutil 的lz4/zstd压缩好像稍逊了些
回复

使用道具 举报

23#
发表于 2024-4-5 12:16:12 | 只看该作者
感谢分享,很棒。
咨询下是对盘符下所有类型的文件进行压缩么?通过窗口我看到了exe和dll,其它太快看不清,想问明白,谢谢。
回复

使用道具 举报

24#
发表于 2024-4-6 21:23:30 | 只看该作者
学习学习,顶一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-28 20:44

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表