2011-05-04 31 views
48

Tôi có một số mã:

$foo = someFunction 

này xuất ra một thông điệp cảnh báo mà tôi muốn chuyển hướng đến $ null:

$foo = someFunction > $null 

Vấn đề là khi tôi làm điều này, trong khi áp đảo thành công thông báo cảnh báo, nó cũng có tác dụng phụ tiêu cực của NOT populating $ foo với kết quả của hàm.

Làm cách nào để chuyển hướng cảnh báo đến $ null, nhưng vẫn giữ $ foo được điền?

Ngoài ra, làm thế nào để bạn chuyển hướng cả đầu ra tiêu chuẩn và lỗi chuẩn sang null? (Trong Linux, nó là 2>&1.)

+1

gì tạo ra thông điệp cảnh báo? Nếu bạn là tác giả của 'someFunction', bạn có thể thay đổi nó một cách thích hợp. – stej

+0

Trên thực tế, trong Bourne Shell (Linux), nó là '2>/dev/null 1>/dev/null'; Chuyển hướng bạn đã hiển thị chuyển hướng stderr đến cùng một vị trí như stdout - có thể là '/ dev/null' hoặc có thể là tệp thông thường. – jpaugh

Trả lời

10

Điều này sẽ hiệu quả.

$foo = someFunction 2>$null 
-2

Giả sử các thông báo lỗi được trả về đầu tiên:

$foo = someFunction 
$foo = $foo[1] 

Nếu giá trị biến được trả về đầu tiên:

$foo = someFunction 
$foo = $foo[0] 
97

Tôi muốn theo cách này để chuyển hướng đầu ra tiêu chuẩn (PowerShell mẹ đẻ) ...

($foo = someFunction) | out-null 

Nhưng này hoạt động quá:

($foo = someFunction) > $null 

Để chuyển hướng lỗi chỉ tiêu chuẩn sau khi xác định $ foo với kết quả của "someFunction", làm

($foo = someFunction) 2> $null 

Đây là một cách hiệu quả tương tự như đã đề cập ở trên.

Hoặc để chuyển hướng bất kỳ thông báo lỗi chuẩn từ "someFunction" và sau đó xác định $ foo với kết quả:

$foo = (someFunction 2> $null) 

Để chuyển hướng cả hai bạn có một vài lựa chọn:

2>&1>$null 
2>&1 | out-null 
+0

Cảm ơn J. Điều đó cũng giải quyết được một trong những vấn đề của tôi. –

2

thông điệp cảnh báo nên được viết bằng lệnh ghép ngắn Write-Warning, cho phép thông báo cảnh báo bị chặn bằng thông số -WarningAction hoặc biến tự động $WarningPreference. Chức năng cần sử dụng CmdletBinding để triển khai tính năng này.

function WarningTest { 
    [CmdletBinding()] 
    param($n) 

    Write-Warning "This is a warning message for: $n." 
    "Parameter n = $n" 
} 

$a = WarningTest 'test one' -WarningAction SilentlyContinue 

# To turn off warnings for multiple commads, 
# use the WarningPreference variable 
$WarningPreference = 'SilentlyContinue' 
$b = WarningTest 'test two' 
$c = WarningTest 'test three' 
# Turn messages back on. 
$WarningPreference = 'Continue' 
$c = WarningTest 'test four' 

Để làm cho nó ngắn hơn tại dấu nhắc lệnh, bạn có thể sử dụng -wa 0:

PS> WarningTest 'parameter alias test' -wa 0 

Write-Lỗi, Viết-Verbose và Viết-Debug cung cấp chức năng tương tự như đối với các loại tương ứng của họ về tin nhắn.

3

Nếu đó là lỗi mà bạn muốn ẩn bạn có thể làm điều đó như thế này

$ErrorActionPreference = "SilentlyContinue"; #This will hide errors 
$someObject.SomeFunction(); 
$ErrorActionPreference = "Continue"; #Turning errors back on 
Các vấn đề liên quan