【发布时间】:2011-10-05 01:40:42
【问题描述】:
我有一个 PowerShell 2.0 脚本,它可以从上到下处理大型文件共享,通过 Start-Process 启动另一个可执行文件并等待结果和退出代码来更正权限等,代码如下:
Start-Process -FilePath $exe -ArgumentList $allargs -Wait -Passthru -NoNewWindow -RedirectStandardOutput $tempoutputfile -RedirectStandardError $temperrorfile;
该脚本可以运行几个小时,处理数千个条目,然后最终会开始出现类似以下的奇怪错误:
-
"Start-Process : 由于进程 (PID) 已退出,无法处理请求。" -- 所以进程关闭得太快以至于没有返回任何状态?
"Start-Process : 由于错误无法执行此命令:没有足够的存储空间来处理此命令。" -- 文件上有超过 20GB 的可用空间分享我正在研究的内容,以及我测试过的两个不同系统上的系统驱动器(更不用说大量的可用 RAM 和虚拟内存)。
请注意,我使用的是内置的 Start-Process cmdlet,而不是 PSCX ——但顺便说一下,它的行为方式相同(因为它们都基于 .NET's Process class)。
另请注意,它看起来一点也不像内存管理问题 - PowerShell 进程在进程早期的工作集小于 100MB 时达到峰值,并且在运行数小时后永远不会超过该值。
有人知道如何阻止这些错误吗?或者,如何调试它们?
-----解决办法-----
感谢@JPBlanc 指出以下解决方案:
1.) 为了解决“没有足够的存储空间来处理此命令”错误,我在托管文件共享的本地服务器上运行了 PowerShell 脚本(而不是通过受某些内存影响的 CIFS 共享)限制)。
2.) 为了解决“无法处理请求,因为进程 (PID) 已退出”错误,我不得不添加对 System.Diagnostics.Process 对象的 HasExited 属性的额外测试,如下所示:
$ps = Start-Process -FilePath $exe -ArgumentList $allargs -Wait -Passthru -NoNewWindow -RedirectStandardOutput $tempoutputfile -RedirectStandardError $temperrorfile;
do {} until ($ps.HasExited); # wait...
$ps.ExitCode; # <-- this is what I really needed from the output
脚本现在运行没有错误!
【问题讨论】:
-
脚本是否在远程机器上共享或共享的同一框中工作?
-
通常在远程机器上,因为托管文件共享的盒子没有安装 PowerShell(并且 24x7 全天候使用)。
-
您是否测试过使用 [Diagnostics.Process] 转换您的代码?