Chuyển hướng lỗi tiêu chuẩn sang một biến trong PowerShell


16

Tôi muốn kịch bản một bài kiểm tra dcdiag để thông báo cho tôi nếu nó tìm thấy bất kỳ lỗi nào. Tôi nghĩ rằng tôi có thể làm điều này trong PowerShell bằng ...

$test = dcdiag 2>$err

Hiện tại tôi không có bất kỳ lỗi nào từ dcdiag, vì vậy tôi không thể kiểm tra trực tiếp điều đó, nhưng tôi đã viết một tập lệnh PowerShell khác để đưa ra một ngoại lệ, hy vọng tôi có thể kiểm tra phương pháp này bằng cách sử dụng tập lệnh đó. Điều này không hoạt động bằng cách sử dụng phương pháp trên vì vậy tôi đã chọn:

try {
    $test = dcdiag
}
catch { 
    $err = $_.Exception.Message
}

Nó hoạt động cho trường hợp thử nghiệm của tôi, nhưng tôi không biết liệu điều này có nhận được lỗi tiêu chuẩn từ dcdiag không.

Làm cách nào tốt nhất để tôi đạt được chuyển hướng lỗi tiêu chuẩn đến một biến trong PowerShell nếu tôi muốn sử dụng nó với dcdiag?

Câu trả lời:


18

try...catch sẽ không giúp đỡ trong trường hợp này.

Bạn có thể muốn làm:

$test = dcdiag 2>&1
$err = $test | ?{$_.gettype().Name -eq "ErrorRecord"}
if($err){
    # Error has occurred
}

3
Ah, tôi đã không nói trong câu hỏi ban đầu; Có thể giữ cả stdout và stderr? tức là $ test = stdout và $ err = stderr?
Ablue

2
@Ablue - $testsẽ có cả hai, đó là lý do tại sao tôi lọc ra lỗi $err.
manojlds

1
Đảm bảo $ ErrorActionPreference không được đặt thành "SilentlyContinue". Khi đó là dòng lỗi không có sẵn.
cmcginty

@cmcginty thực sự $ ErrorActionPreference nên được đặt thành "Tiếp tục". Sử dụng SilentlyContinue sẽ chỉ thu được thiết bị xuất chuẩn vì thiết bị lỗi chuẩn sẽ bị xóa hoàn toàn (ít nhất là trên powershell 5)
Simon Bergot

2
@Simon Đúng, tôi đã nói KHÔNG sử dụng SilentlyContinue.
cmcginty
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.