2011-12-05 4 views
51

Khi kịch bản PowerShell của tôi cố gắng, ví dụ, để tạo một đối tượng SQL Server cho một máy chủ không tồn tại ("bla" trong trường hợp của tôi), PowerShell hiển thị nhiều lỗi PowerShell màu đỏ.Powershell: Làm thế nào tôi có thể ngừng hiển thị lỗi trong tập lệnh?

Vì tập lệnh của tôi kiểm tra giá trị $? sau các cuộc gọi như vậy và hiển thị lỗi nhật ký, tôi không muốn hiển thị nhiều dòng lỗi PowerShell.

Làm cách nào để hủy kích hoạt những hiển thị cho tập lệnh của tôi?

Trả lời

79

Bạn có một vài tùy chọn. Sự liên quan dễ dàng nhất bằng cách sử dụng cài đặt ErrorAction.

-Erroraction là thông số chung cho tất cả các lệnh ghép ngắn. Nếu có các lệnh đặc biệt bạn muốn bỏ qua, bạn có thể sử dụng -erroraction 'silentlycontinue' về cơ bản sẽ bỏ qua tất cả các thông báo lỗi được tạo bởi lệnh đó. Bạn cũng có thể sử dụng giá trị Ignore (trong PowerShell 3+):

Không giống như SilentlyContinue, Bỏ qua không thêm thông báo lỗi vào biến $ Error tự động.

Nếu bạn muốn bỏ qua tất cả các lỗi trong một kịch bản, bạn có thể sử dụng hệ thống biến $ErrorAction và làm điều tương tự: $ErrorActionPreference= 'silentlycontinue'

Xem about_CommonParameters để biết thêm.

+7

Thiết lập biến hệ thống là các trick. –

12

Windows PowerShell cung cấp hai cơ chế để báo cáo lỗi: một cơ chế cho lỗi kết thúc và một cơ chế khác cho lỗi không chấm dứt.

Mã CmdLets nội bộ có thể gọi phương thức ThrowTerminatingError khi xảy ra lỗi không hoặc không cho phép lệnh ghép ngắn tiếp tục xử lý đối tượng đầu vào của nó. Người viết kịch bản có thể sử dụng ngoại lệ để bắt các lỗi này.

EX:

try 
{ 
    Your database code 
} 
catch 
{ 
    Error reporting/logging 
} 

CmdLets Internal mã có thể gọi một phương thức WriteError để báo cáo lỗi không chấm dứt khi các lệnh có thể tiếp tục xử lý các đối tượng đầu vào. Sau đó, người viết kịch bản có thể sử dụng tùy chọn -ErrorAction để ẩn các thư hoặc sử dụng $ErrorActionPreference để thiết lập toàn bộ hành vi tập lệnh.

6

Tôi gặp sự cố tương tự khi cố gắng phân giải tên máy chủ bằng cách sử dụng [system.net.dns]. Nếu IP không được giải quyết. Net đã ném một lỗi kết thúc. Để ngăn chặn lỗi kết thúc và vẫn giữ quyền kiểm soát đầu ra, tôi đã tạo một hàm sử dụng TRAP.

E.G.

Function Get-IP 
{PARAM ([string]$HostName="") 
PROCESS {TRAP 
      {"" ;continue} 
      [system.net.dns]::gethostaddresses($HostName) 
     } 
} 
-1

Nếu bạn muốn errormessage PowerShell cho một lệnh đàn áp, nhưng vẫn muốn bắt lỗi, sử dụng "-erroraction 'silentlyStop"

+0

Không có hành động nào như vậy. Có một hành động Stop. –