2011-03-10 16 views
13

Neden Powershell'in Write-Error cmdlet'i çalışmıyor?Write-Error kullanarak Powershell'de hata akışına yazma

PS C:\> Write-Error "This is an error" 
Write-Error "This is an error" : This is an error 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 
Ben benzer çıktı beklediklerinden

Write-Warning için: Ben herhangi bir istisna görmemeniz gerekir düşünce Write-Error ve about_preference_variables belgelerine

PS H:\> Write-Warning "This is a warning" 
WARNING: This is a warning 

Benim çıkış belgelerinde örneklere benzemiyor ?

PS H:\> Get-Help About_Preference_Variables 

$ErrorActionPreference 
---------------------- 

... 

     PS> $erroractionpreference      
     Continue  # Display the value of the preference.     

     PS> write-error "Hello, World"     
           # Generate a non-terminating error. 

     write-error "Hello, World" : Hello, World  
           # The error message is displayed and 
            execution continues. 

     PS> write-error "Hello, World" -ErrorAction:SilentlyContinue 
           # Use the ErrorAction parameter with a 
            value of "SilentlyContinue". 
     PS>            
           # The error message is not displayed and 
            execution continues. 
+0

çıktıda ne görmeyi bekliyorsunuz? Deftere kimse benimle gayet normal görünüyor. –

+1

@zespri Yazma-Uyarı ile benzer bir şey bekliyordum ... Soruyu bir örnek ekledim. –

+2

Gördüğünüz çıktı doğru. Çıkış, biraz daha ayrıntılı olmak için v2.0 IIRC ile değişti. Belgeler yanlış - ilk defa değil. :-) –

cevap

14

-uyarı yazmaya benzer çıktı almak için, bunu yapabilirsiniz:

$Host.UI.WriteErrorLine("This is an error") 

(Bu yanıt için Chris Sears'a sahne)

+0

Harika! Bu benim için kesinlikle yararlı. –

+2

İlginç bir şekilde, bu stdout'a yazıyor, stderr'e değil. PowerShell ISE normal PowerShell komut istemi yapsa da (özel bir biçimlendirme uygulanmadığında) yankılanmıyor. Her birinde '[System.Console] :: Error.WriteLine ('test')' yi çalıştırmayı deneyin ve ne olduğunu görün. – Zenexer

+2

Bunu yapma. 'WriteErrorLine' bir UI yöntemidir, bu yüzden Zenexer hiçbir şeyin stderr'e yönlendirilmediğini söyler. Keith Hill'in yanıtına ve http://stackoverflow.com/questions/4998173/how-do-i-write-to-standard-error-in-powershell adresine bakın. –

2

Bunu cmdlet'indeki beklenen çıkışı görüyoruz inanıyoruz. "Erişim reddedildi" ifadesini giriyorsunuz. argüman ve bunu ana bilgisayara ve muhtemelen tasarlandığı şekilde hata akışına gönderir. $ Error değişkenine çıktısını onaylayabilirsiniz ve eklediğiniz hata ile doldurulmalıdır.

yani

PS C:\> $error.Clear() 

PS C:\> Write-Error "access denied" 

Write-Error "access denied" : access denied 

    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

PS C:\> $error 

Write-Error "access denied" : access denied 

    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

o olsa kafa karıştırıcı nerede olacağını belki MSFT netlik için için "Falanca" "Erişim engellendi" gibi bir şey örnek hatasını değişmelidir görebilirsiniz.

Adrese daha fazla soru için: Yazma hatası için varsayılan errorAction "devam" şeklindedir, bu nedenle Yazma-Uyarı gibi davranmasını sağlamak için -ErrorAction SilentlyContinue eklemeniz gerekir.

PS E:\> $error.clear() 
PS E:\> Write-Error 'test' 
Write-Error 'test' : test 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

PS E:\> Write-Error 'test2' -ErrorAction silentlycontinue 

PS E:\> $error[1] 
Write-Error 'test' : test 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

PS E:\> $error[0] 
Write-Error 'test2' -ErrorAction silentlycontinue : test2 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 
+0

Neden "CategoryInfo belirtilmemiş" WriteErrorException olsun? Belgeleme, isteğe bağlı olduğunu söylüyor ... –

+0

Kategori bilgisini belirtilmemiş olarak listeliyor çünkü ne görüntülediğiniz standart hata çıktısıdır, Yazma-Hata ne yapar; herhangi bir hata PS atıldığında şablonu ... örnek görüntülendiğini: 1 karakter: 7 + lkas satırında tanınmadı 'lkas: ' terim lkas \> PS E code'' <<<< + CategoryInfo: ObjectNotFound: (lkasjd: string) [], CommandNotFoundException + FullyQualifiedErrorId: 'Kategori bilgileri her listelenen code' CommandNotFoundException; Write-Error komutuyla açıkça belirtmediğinizden beri belirtilmemiş olarak gösterilir. –

+0

Üzgünüm, oradaki mini işaretlemeyi berbat ettim. Sorunun daha fazla kapsamını ele almak için orijinal gönderimi düzenlediğimi unutmayın. Dağınıklık için üzgünüm :) –

5

Neden bunu çalışıyor sanmıyorum: Aşağıdaki örneği inceleyin? PowerShell'in yukarıdaki gibi olmayan sonlandırma hataları ile throw 'Access denied.' çalıştırdığınızda olduğu gibi hataların sonlandırılması arasında ayrım yaptığını unutmayın. Sonlanmayan hatalar stderr'e yazılır ve $ error topluluğuna kaydedilir ancak bir betiğin işlenmesini durdurmazlar. Bu özellik, bir sürü dosya işlerken (silme veya kopyalama) son derece kullanışlıdır. Dosyaların işleme alınamadı hangi bilmek istiyorum ama tüm operasyon ilk dosyada hatalar dışarı durmak istemiyorum. PowerShell ayrıca örneğin hataları sonlandırma olmayan sonlandırma hataları "dönüştürmek" seçeneği sunar

Remove-Item c:\file-doesnt-exist -ErrorAction Stop; "Did I get here" 

Bu durumda dikkat, yürütme durur ve sonunda dize yazdırılmaz. -ErrorAction Stop bulunmadan deneyin ve hata görürsünüz ama aynı zamanda dize "Ben buraya geldi mi" göreceksiniz. Eğer şöyle -Kategoriler parametresini kullanabilirsiniz catogory bilgi denetlemek istiyorsanız

:

PS> write-error "foo" -Category 'InvalidResult' 
write-error "foo" -Category 'InvalidResult' : foo 
    + CategoryInfo   : InvalidResult: (:) [Write-Error], WriteErrorExce.. 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

Ama WriteErrorException mekanizması olan bu cmdlet hata yükseltir (Sanırım). Orada bir Exception parametredir ama bunu kullanarak pek şanslı ettik.

İlgili konular