错误的时候叫的第3次缔约方可执行的,从何时使用IDE
-
21-09-2019 - |
题
我有一个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
}