ข้อผิดพลาดมาตรฐานเปลี่ยนเส้นทางไปยังตัวแปรใน PowerShell


16

ฉันต้องการสคริปต์ทดสอบ dcdiag เพื่อแจ้งเตือนฉันหากพบข้อผิดพลาด ฉันคิดว่าฉันสามารถทำสิ่งนี้ใน PowerShell ได้โดย ...

$test = dcdiag 2>$err

ฉันไม่มีข้อผิดพลาดจาก dcdiag ในขณะนี้ดังนั้นฉันจึงไม่สามารถทดสอบได้โดยตรง แต่ฉันเขียนสคริปต์ PowerShell อีกอันเพื่อส่งข้อยกเว้นหวังว่าฉันจะสามารถทดสอบวิธีนี้โดยใช้สคริปต์นั้น ไม่สามารถใช้วิธีการข้างต้นได้ดังนั้นฉันเลือกใช้

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

มันใช้งานได้กับกรณีทดสอบของฉัน แต่ฉันไม่รู้ว่าจะรับข้อผิดพลาดมาตรฐานจาก dcdiag หรือไม่

ฉันควรบรรลุข้อผิดพลาดมาตรฐานที่ดีที่สุดในการเปลี่ยนเส้นทางไปยังตัวแปรใน PowerShell ได้อย่างไรเนื่องจากฉันต้องการใช้กับ dcdiag

คำตอบ:


18

try...catch จะไม่ช่วยในกรณีนี้

คุณอาจต้องการ:

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

3
อาฉันไม่ได้พูดในคำถามดั้งเดิม เป็นไปได้ที่จะเก็บทั้ง stdout และ stderr? เช่น $ test = stdout และ $ err = stderr?
Ablue

2
@Ablue - จะมีทั้งสองอย่างนั่นคือเหตุผลที่ฉันกำลังกรองข้อผิดพลาด$test $err
manojlds

1
ตรวจสอบให้แน่ใจว่า $ ErrorActionPreference ไม่ได้ถูกตั้งค่าเป็น "SilentlyContinue" เมื่อเป็นสตรีมข้อผิดพลาดจะไม่สามารถใช้ได้
cmcginty

@cmcginty จริง ๆ แล้ว $ ErrorActionPreference ควรตั้งเป็น "ดำเนินการต่อ" การใช้ SilentlyContinue จะจับเฉพาะ stdout เท่านั้นเนื่องจาก stderr จะถูกลบออกอย่างสมบูรณ์ (อย่างน้อยใน PowerShell 5)
Simon Bergot

2
@Simon ถูกต้องฉันว่าอย่าใช้ SilentlyContinue
cmcginty
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.