2010-01-19 37 views
44

Tôi có tập lệnh PowerShell sử dụng du.exe (Disk Usage ban đầu từ Sysinternals) để tính kích thước của thư mục.Lỗi khi gọi cho bên thứ ba thực thi từ Powershell khi sử dụng IDE

Nếu tôi chạy du c:\Backup trong giao diện điều khiển, nó hoạt động như mong đợi, nhưng cùng một dòng mã chạy trong ISE hoặc PowerGUI cho kết quả mong đợi cộng với lỗi

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

Tại sao vậy? Làm cách nào để tránh lỗi này? Tôi đã thử gọi biểu thức, sử dụng &, nhưng không được.

Cảm ơn sự giúp đỡ.

+0

Lưu ý rằng nếu bạn có '$ ErrorActionPreference' thiết cho' Stop' này sẽ thực sự chấm dứt thực hiện tập lệnh của bạn. Giải pháp của tôi là đặt nó thành 'Tiếp tục', gọi lệnh và đặt lại thành' Stop'. –

Trả lời

34

Để tránh điều này, bạn có thể chuyển hướng stderr null ví dụ .:

du 2> $null 

Về cơ bản các máy chủ giao diện điều khiển và ISE (cũng như remoting) đối xử với dòng stderr khác nhau. Trên máy chủ bàn điều khiển, điều quan trọng là PowerShell phải hỗ trợ các ứng dụng như edit.com để làm việc cùng với các ứng dụng khác có ghi kết quả đầu ra màu và lỗi trên màn hình. Nếu luồng I/O không được chuyển hướng trên máy chủ bàn điều khiển, PowerShell sẽ cung cấp cho EXE một bảng điều khiển xử lý để ghi trực tiếp. Điều này bỏ qua PowerShell để PowerShell không thể thấy rằng có lỗi được ghi để nó không thể báo cáo lỗi thông qua lỗi $ hoặc bằng cách ghi vào luồng stderr của PowerShell.

ISE và điều khiển từ xa không cần phải hỗ trợ kịch bản này để họ thấy lỗi trên stderr và sau đó ghi lỗi và cập nhật lỗi $.

+0

Cảm ơn bạn rất nhiều. Nó hoạt động hoàn hảo. Lucas – Lucas

+0

Đã lưu ngày.Hoàn hảo! – Thomas

+0

Làm việc tốt với PSEXEC! Cảm ơn! –

31

Gần đây tôi đã gặp phải các vấn đề tương tự, nhưng tôi muốn nhận được kết quả đầu ra stderr hướng tới stdout. Bạn sẽ nghĩ rằng những điều sau đây sẽ hoạt động:

& du 2>&1 

Nhưng PowerShell sẽ giải thích chuyển hướng và xử lý sau khi hoàn thành 'du'. Các công việc xung quanh tôi thấy là để gọi nó bằng cách sử cmd.exe/c:

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

Điều này làm việc cho tôi, nơi tôi không thể sử dụng câu trả lời từ KeithHill. Cảm ơn SimonEjsing! – mbourgon

+0

Điều này làm việc cho tôi, mà không thực hiện trong bối cảnh cmd tôi vẫn có lỗi. –

+3

Điều này làm việc cho tôi. Tôi cũng cần phải vượt qua trong các tùy chọn, do đó, cú pháp đầy đủ cho tôi là '' '& cmd/c 'foo.exe 2> & 1' option1 option2'''. (Lưu ý rằng chỉ có tên thực thi và '2> & 1' đi vào bên trong dấu nháy đơn.) – user2441511

8

Một cách khác để ngăn chặn các NativeCommandError ra là để chuyển đổi các đối tượng trong các đường ống để chuỗi như đã nêu ở phía dưới của this answer:

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

Hãy thử:

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

Previ F FIX sẽ chuyển hướng lỗi nhưng bạn có thể mất một lỗi thực nếu ví dụ tên người dùng hoặc mật khẩu của bạn không tốt hoặc nếu sử dụng xác thực tích hợp, bạn không có quyền truy cập.

Vì vậy, đây là một cách để thực hiện xử lý lỗi và bỏ qua lỗi cụ thể (không phải là một) do psexec đưa ra.

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

Nếu bạn có thể điền vào phần còn lại của mã để làm cho nó có thể biên dịch được, vì hiện tại mã của nó không hợp lệ. – sean

Các vấn đề liên quan