我有一个PowerShell脚本,使用du.exe (磁盘的使用情况 来自微软)来计算大小目录。

如果我运行 du c:\Backup 在控制台,它的工作不如预期,但是同样的代码行运行在伊势或PowerGui提供预期的结果,加上错误

+ du <<<<  c:\backup
+ CategoryInfo          : NotSpecified: (:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

为什么?我该如何避免这种错误?我试图引用的表达,使用 &, ,但是没有去。

谢谢你的帮助。

有帮助吗?

解决方案

要避免这种情况可以标准错误重定向到空e.g:

du 2> $null

基本上控制台主机和ISE(以及远程处理)治疗stderr流不同。在控制台主机,重要的是PowerShell来与写彩色输出和错误到屏幕上的其他应用程序一起像edit.com支持应用程序的工作。如果I / O流不控制台主机重定向,PowerShell中给出了本地EXE控制台句柄写入直接。这绕过的PowerShell这样的PowerShell不能看到有这么写它不能通过$错误或写信给PowerShell的标准错误流报告错误错误。

ISE和远程处理不需要那么他们看到标准错误的错误,以支持此方案,并随后写错误,更新$错误。

其他提示

我最近一直面临着同样的问题,但我想获得定向到标准输出标准错误输出。你会认为,以下将工作:

    & du 2>&1

但是PowerShell的将interprete重定向和后“杜”处理它被完成。的变通我发现是使用cmd.exe的/ C来调用它:

    & cmd /c 'du 2>&1'

另一种方式抑制 NativeCommandError 输出是转换 对象 在管道 字符串 如概述了在底部的 这个答案:

du c:\Backup 2>&1 | %{ "$_" }

尝试:

du 2>&1 | %{ "$_" }

以前的补丁将重定向错误,但如果您例如用户名或密码是不好的,或者如果使用集成的身份验证你可能会失去一个真正的错误,你没有访问。

因此,这里是为执行错误处理和旁路特定错误(即不是一个)通过PSEXEC提出的一种方式。

 try{
            	psexec command .....
            }
            catch [System.Management.Automation.RemoteException]{
                if ($_.TargetObject -like "Connecting to *" -and $_.CategoryInfo.Category -eq "NotSpecified" -and $_.FullyQualifiedErrorId -eq "NativeCommandError" -and $_.InvocationInfo.MyCommand.Name -like "psexec*.exe"){
                    $error.Remove[$Error[0]]
                }
                else{
                    Throw
                }
            }        
            catch{
                throw
            }

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top