![Powershell - 压缩存档消耗所有内存](https://linux22.com/image/703123/Powershell%20-%20%E5%8E%8B%E7%BC%A9%E5%AD%98%E6%A1%A3%E6%B6%88%E8%80%97%E6%89%80%E6%9C%89%E5%86%85%E5%AD%98.png)
我对 powershell 和脚本还不熟悉。
我正在尝试使用 compress-archive cmdlet 压缩 IIS 日志文件(总共 60GB),但是每次我都会收到错误:
“引发了‘System.OutOfMemoryException’类型的异常。”
我已经将 MaxMemoryPerShellMB 调整为 2048MB 并重新启动了 WinRM 服务。
执行命令时,RAM 内存消耗超过 6GB。
我使用的代码如下:
$exclude = Get-ChildItem -Path . | Sort-Object -Descending | Select-Object -First 1
$ArchiveContents = Get-ChildItem -Path . -Exclude $exclude | Sort-Object -Descending
Compress-Archive -Path $ArchiveContents -DestinationPath .\W3SVC2.zip -Force
Powershell 版本是 5。有人可以指导我吗?
提前致谢。
答案1
正如 Daniel 所说,使用 .NET 类。您可以这样做:
# File or directory to zip
$sourcePath = "C:\Path\To\File"
# Resulting .zip file
$destinationPath = "C:\Path\To\File.zip"
# Compression level. Optimal means smallest size, even if it takes a little longer to compress
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
# Whether or not to include root directory (if zipping a directory) in the archive
$includeBaseDirectory = $false
Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::CreateFromDirectory("$sourcePath","$destinationPath",$compressionLevel,$includeBaseDirectory)
这将创建目录的 zip 文件,并且几乎不占用任何 RAM。我尝试使用这两种方法压缩同一个(25 GB 大)目录。使用时,Compress-Archive
我看到 RAM 使用量超过 6GB,然后我不得不终止主机进程,而使用上述方法时,powershell 主机进程的 RAM 使用量没有增加。