2010-01-19 70 views
44

我有一个使用du.exe(最初来自Sysinternals的Disk Usage)的PowerShell脚本来计算目录的大小。使用IDE从Powershell调用第三方可执行文件时出错

如果我在控制台中运行du c:\Backup,它按预期工作,但代码运行在ISE或PowerGUI的同一行给出的预期结果加上错误

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

这是为什么?我如何避免这个错误?我尝试了invoke-expression,使用&,但没有去。

感谢您的帮助。

+0

需要注意的是,如果你有'$ ErrorActionPreference'设置为'Stop'这实际上将停止脚本的执行。我的解决方案是将其设置为“继续”,调用该命令并将其重新设置为“停止”。 – 2016-08-04 12:01:48

回答

34

为了避免这种情况,你可以重定向错误输出到空例如为:

du 2> $null 

本质上的控制台主机和ISE(以及远程)治疗stderr流不同。在控制台主机上,PowerShell支持像edit.com这样的应用程序与其他应用程序一起工作非常重要,该应用程序会在屏幕上写入彩色输出和错误。如果I/O流未在控制台主机上重定向,则PowerShell会为本机EXE提供控制台句柄以直接写入。这绕过PowerShell,因此PowerShell无法看到写入错误,因此无法通过$ error或通过写入PowerShell的stderr流来报告错误。

ISE和远程处理不需要支持这种情况,所以他们看到stderr上的错误,然后写入错误并更新$错误。

+0

非常感谢。它工作完美。 Lucas – Lucas 2010-01-19 20:20:54

+0

节省了一天的时间。完善! – Thomas 2012-09-05 08:46:16

+0

与PSEXEC一起工作得很好!谢谢! – 2013-12-05 16:56:53

31

我最近一直面临同样的问题,但我希望将stderr输出指向标准输出。你会认为,以下将工作:

& du 2>&1 

但经过“杜”的PowerShell将interprete重定向并处理完毕。我发现,身边的工作是使用cmd.exe的/ C来调用它:

& cmd /c 'du 2>&1' 
+0

这一个为我工作,我不能使用KeithHill的答案。感谢SimonEjsing! – mbourgon 2013-10-03 14:41:26

+0

这为我工作,没有在cmd上下文执行我仍然有错误。 – 2016-01-07 15:59:05

+3

这对我有用。我还需要传递选项,所以我的完整语法是'''&cmd/c'foo.exe 2>&1'option1 option2'''。 (请注意,只有可执行文件名和'2>&1'位于单引号内。) – user2441511 2016-10-05 18:25:35

8

另一种方式来抑制NativeCommandError输出到对象转换的管道在底部列出this answer

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

尝试:

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

PREVI如果您的用户名或密码不好,或者如果使用集成身份验证,您无法访问,FIX会重定向错误,但可能会丢失真正的错误。

因此,这是一种实现错误处理并绕过由psexec引发的特定错误(不是一种)的方法。

try{ 
 
      \t 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 
 
      }

+0

如果您可以填充剩余的代码以使其可编译,因为它目前代码无效。 – sean 2017-02-17 20:40:08

相关问题