我正在使用PowerShell v5并尝试使用Microsoft.PowerShell.Archive模块中的someMethod
cmdlet存档该文件:
Compress-Archive
这可以完美地处理3个文件,其大小如下:Compress-Archive -LiteralPath $GLBSourcePathFull -CompressionLevel Optimal -DestinationPath $GLBArchiveFile
,16MB
和341MB
。
但是,一旦遇到大于345MB
(大约)的文件,PowerShell就会抛出以下异常:
600MB
同样的事情发生在大小超过Exception calling "Write" with "3" argument(s): "Exception of type 'System.OutOfMemoryException' was thrown."
的文件中。
要为我的情况添加更多上下文,我正在尝试将文件从本地文件夹压缩到我公司内的一个网络位置,但是我怀疑是否存在差异,因为我在本地PC上测试了这个得到相同的结果。
你以前遇到过这种情况吗?在输出zip而不是直接写入磁盘之前是否尝试将整个文件读入内存?或者,默认情况下PowerShell可以使用多少内存?
我知道还有其他一些解决方案,比如1GB
模块,但此时我不允许使用任何开源软件,因此我想了解我目前的情况以及我可能如何解决此
感谢您提出任何意见。
答案 0 :(得分:0)
Compress-Archive cmdlet可能使用一种简单的方法将整个源文件和目标存档加载/映射到内存中,因为您显然使用32位PowerShell这些文件(以及PowerShell进程代码和其他数据)过程使用的)不适合2GB的进程地址空间(如果是LARGEADDRESSAWARE则为3-4GB)。
具有大量RAM(例如32GB)的计算机上的64位PowerShell成功压缩1GB +文件。
如果您坚持使用32位PowerShell和内置cmdlet,请尝试将文件拆分为100MB文件,并使用一些描述性文件名,以便能够在解压缩脚本中加入它们。显然,对于没有重新组装脚本的人来说,这样的存档将无法使用。