脚本运行了一段时间后,Start-Process错误不稳定



我有一个PowerShell 2.0脚本,它从上到下处理大文件共享,通过Start-Process启动另一个可执行文件并等待结果和退出代码来纠正权限等,代码如下:

Start-Process -FilePath $exe -ArgumentList $allargs -Wait -Passthru -NoNewWindow -RedirectStandardOutput $tempoutputfile -RedirectStandardError $temperrorfile;

脚本在几个小时内可以很好地工作,处理数千个条目,然后最终它会开始给出如下奇怪的错误:

  • "Start-Process:无法处理请求,因为进程(PID)已经退出。"——所以进程关闭得太快以至于没有返回任何状态?

  • "Start-Process:这个命令不能执行,因为错误:没有足够的存储空间来处理这个命令。"—我正在使用的文件共享上有超过20GB的空闲空间,以及我测试过的2个不同系统上的系统驱动器(更不用说大量的空闲RAM & &;虚拟内存)。

请注意,我使用的是内置的Start-Process cmdlet,而不是PSCX的cmdlet——但顺便说一下,它的行为方式是一样的(因为它们都是基于。net的Process类)。

还请注意,它看起来一点也不像内存管理问题——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

脚本现在运行无错误!

当你在共享上运行脚本时,这可能是由服务器服务耗尽进程内存引起的,或者是由系统上的进程消耗内存句柄而没有正确释放它们引起的,这篇文章中有一些测试建议。在过去,我曾经在一个应用程序上有一个类似的错误,在共享上打开了很多文件,修改IRPStackSize注册表键似乎有帮助。

——编辑——

据我所知,"无法处理请求,因为进程(PID)已经退出"是由于在Start-Process下使用了[Diagnostics.Process],并且在没有测试hasexited属性是否为真或假的情况下播放-Wait参数。为了纠正这个错误,我将检测我的代码,以准确地发现这个附加在哪个文件上。对我来说,这个错误是由于您的$exe$allargs调用的特定错误。

最新更新