0

我创建了一个 powershell 脚本,它加载一些大 (50MB+) XML 文件并从中检索一些值。它可以作为独立脚本正常工作(但速度很慢)。

当我从 msbuild proj 文件中调用 .ps1 时,它正常启动,但随后在加载带有 System.OutOfMemoryException 异常的大 XML 文件时死掉。

"C:\Program Files (x86)\MSBuild\12.0\Bin\msbuild.exe" Test.proj

电源外壳 4.0

我的解决方法是使用 XMLReader 而不是 XMLDocument,这样它就可以进行顺序读取,工作速度更快,并且不会在 MSBUILD 下死掉。

尽管我对我的解决方法感到满意,但我仍然想知道为什么在从 msbuild 任务执行 ps1 时会有内存限制?

32 位版本的 MSBUILD 是罪魁祸首吗?还是设计使然?

4

1 回答 1

1

您可以尝试增加 PowerShell 内存限制

在大型环境中运行脚本时,您可能会在 PowerShell 中遇到异常,告诉您内存不足。

PS-OutOfMemory

要获取每个 shell 可用内存量的值,请运行以下命令:

PS-GetMaxMemoryPerShellMB

PowerShellMaxMemoryPerShellMB配额在 v1 和 v2 中默认为仅 150MB,在 v3 中默认为 1024MB。但即使在 PowerShell 3.0 下,大型对象也会消耗大量内存。

您可以通过增加 的值来解决“内存不足”异常MaxMemoryPerShellMB。为此,请使用以下命令:

PS-SetMaxMemoryPerShellMB

如上面的屏幕截图所示,您可以Get-Item再次运行该命令来验证该命令。

最后:重新启动 winrm 服务......你就完成了:-)

完全取消限制:

我在运行在该远程主机上启动 java 程序的 powershell 远程命令时遇到内存限制问题。我发现将其设置 MaxMemoryPerShellMB为零,有效地消除了限制并允许我的程序运行

Set-Item .\MaxMemoryPerShellMB 0

笔记:

...这个设置只影响 WSMan shell 而不是 PowerShell 本身。这些设置仅适用于 WSMan 调用 WinRM 的远程处理组件。它们也可以通过 WinRM 在命令提示符下进行配置。

参考:

于 2015-09-02T02:14:14.450 回答