无忧启动论坛

标题: 一个全盘compact压缩的powershell脚本 [打印本页]

作者: shuini    时间: 2023-12-25 16:21
标题: 一个全盘compact压缩的powershell脚本
习惯用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
}


作者: zsyloveyp    时间: 2023-12-25 16:36
感谢分享  
作者: yyz2191958    时间: 2023-12-25 17:36
谢谢分享
作者: shuini    时间: 2023-12-25 18:00
win8要添加compact支持包才能用
作者: 2012andyle113    时间: 2023-12-25 18:14
看起来省点空间而已,反复压缩减负就未必了
作者: yc2428    时间: 2023-12-25 20:20
谢谢分享
作者: nathan6498    时间: 2023-12-25 21:14
谢谢分享
作者: oh312    时间: 2023-12-25 22:54
赞,谢谢分享。
作者: AcidBurn    时间: 2023-12-26 05:00
感谢分享
作者: oh312    时间: 2023-12-26 06:45
赞,谢谢分享。
作者: 车厘子    时间: 2023-12-26 14:30
感谢分享
作者: nathan6498    时间: 2023-12-26 17:51
谢谢分享
作者: sjh87    时间: 2023-12-28 15:35
感谢分享
作者: AcidBurn    时间: 2023-12-29 03:32
感谢分享
作者: 2267981144    时间: 2024-1-15 16:31
多谢提供分享!
作者: jlshnlhj    时间: 2024-1-18 10:28
本帖最后由 jlshnlhj 于 2024-9-5 18:13 编辑

支持哪些Windows版本?Win10,Win11?试了一下,效果不错。

作者: 无犹启动    时间: 2024-1-28 15:22
谢谢分享
作者: abcrazy    时间: 2024-1-28 19:58
谢谢分享
作者: 无犹启动    时间: 2024-1-29 11:06
谢谢分享
作者: tanchenglong    时间: 2024-1-29 11:16
留名,看个标题就走了
作者: tanchenglong    时间: 2024-1-29 13:05
貌似还不够十五字,我只是来打酱油的
作者: JayeDieyan    时间: 2024-1-29 13:20
compact压缩相比refsutil 的lz4/zstd压缩好像稍逊了些
作者: xman00    时间: 2024-4-5 12:16
感谢分享,很棒。
咨询下是对盘符下所有类型的文件进行压缩么?通过窗口我看到了exe和dll,其它太快看不清,想问明白,谢谢。
作者: 2012飘水    时间: 2024-4-6 21:23
学习学习,顶一下
作者: nbhai2018    时间: 2024-7-26 15:39
好用,谢谢分享!~~~
作者: 账号没有注册b    时间: 2024-8-6 17:55
赞一个!
作者: j4tan    时间: 2024-8-26 19:10
不错支持一下,谢谢分享
作者: sevenyu    时间: 2024-8-27 09:04
11可用吗?试了下,一闪就没了?
作者: jlshnlhj    时间: 2024-9-5 18:17
sevenyu 发表于 2024-8-27 09:04
11可用吗?试了下,一闪就没了?
在支持PowerShell的pe下,试试。
作者: 旭东    时间: 2024-9-5 21:13
感谢分享了
作者: beizi1754    时间: 2024-9-5 21:23
这个有点技术含量了




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3