我有一个PowerShell 2.0脚本,可以自上而下处理大型文件共享,通过Start-Process启动另一个可执行文件并等待结果和退出代码来纠正权限等,代码如下:
Start-Process -FilePath $exe -ArgumentList $allargs -Wait -Passthru -NoNewWindow -RedirectStandardOutput $tempoutputfile -RedirectStandardError $temperrorfile;
该脚本可以运行几个小时,处理数千个条目,然后最终会开始出现如下错误:
“启动 - 处理:无法处理请求,因为进程(PID)已退出。” - 所以进程关闭得如此之快,以至于没有返回任何状态?
< / LI>“启动过程:由于错误导致无法执行此命令:没有足够的存储空间可用于处理此命令。” - 文件中有超过20GB的空闲空间分享我正在研究,以及我测试的两个不同系统上的系统驱动器(更不用说丰富的免费RAM和虚拟内存)。
请注意,我使用的是内置的Start-Process cmdlet,而不是PSCX cmdlet - 但顺便说一下,它的行为方式相同(因为它们都基于.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
该脚本现在无错运行!
答案 0 :(得分:2)
当您在共享上运行脚本时,这可能是由于服务器服务耗尽了进程内存,系统上的进程消耗了内存句柄而没有正确释放它们there are some test advices on this post。过去,我曾经在一个在共享上打开大量文件的应用程序上遇到类似的错误,修改IRPStackSize
注册表项似乎有所帮助。
----被修改------
据我所知“无法处理请求,因为进程(PID)已退出”是由于在Start-Process
下使用了[Diagnostics.Process]
并且-Wait参数未被播放测试hasexited
属性是真还是假。为了解决这个错误,我会检测我的代码以确切地发现它附加到哪个文件。对我而言,此错误是由于您使用$exe
调用$allargs
的特定错误。