Bir PowerShell çıktısını yürütme sırasında bir dosyaya yeniden yönlendirme


199

Ben çıktıyı bir dosyaya yönlendirmek istiyorum bir PowerShell komut dosyası var. Sorun, bu komut dosyasının çağrılma şeklini değiştiremem. Bu yüzden yapamam:

 .\MyScript.ps1 > output.txt

Bir PowerShell betiğinin yürütülmesi sırasında çıktısını nasıl yeniden yönlendirebilirim?


@Nathan cevabında belirtildiği gibi, Powershell 3.0 veya üstü kullanıyorsanız, bu işe yaramalıdır.
Şunu

Yanıtlar:


193

Belki Start-Transcriptsenin için çalışır. Önce zaten çalışıyorsa durdurun, sonra başlatın ve bittiğinde durdurun.

$ ErrorActionPreference = "SilentlyContinue"
Konuşma Metni Durdur | dışarı null
$ ErrorActionPreference = "Devam"
Start-Transcript -yol C: \ output.txt -ekleme
# Bazı şeyler yap
Dur-Transkript

Ayrıca, bu şeyler üzerinde çalışırken çalıştırabilir ve daha sonra başvurmak üzere komut satırı oturumlarınızı kaydetmesini sağlayabilirsiniz.

Kopyalama yapmayan bir konuşma metnini durdurmaya çalışırken hatayı tamamen bastırmak istiyorsanız, bunu yapabilirsiniz:

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue" # or "Stop"

13
Başlangıç-transkriptinin Yazma Hatası, Yazma-Ayrıntılı veya Yazma-Hata Ayıklama ... standart çıktılarını kaydetmediğini unutmayın.
Richard Berg

6
@richard: Şimdi öyle görünüyor. Belki bu 2.0 ekidir, bu cevapların 1.0 için geçerli olup olmadığından emin değilim.
Robert S Ciaccio

Yukarıda hemen hemen aynı kodu kullanıyorum. benim sorunum, konuşma transkripti başlatılmazsa Stop-Transcript | out-null hala hata çıktısı gönderir. Düzenimi bozduğu için mesajı bastırmam gerekiyor. - sessizce sessizce devam etmek de yardımcı olmaz. herhangi bir fikir?
Mel

4
Sonunda Start-Transcript belgelerini buldum . (sinir bozucu bir şekilde Powershell sürüm numarası ile etiketlenmemiştir). O diyor "transkript tüm komutu kullanıcı tipleri ve konsolda görünen tüm çıkış içeren". Ancak, ben PowerShell 2.0 Başlat-Transkript test ve @Richard sağ, standart hata olduğunu bulduk değildir transkript kaydedilir. Bu berbat!
Albay Panik

Belirtilen konuma yazma izniniz gerçekten varsa, bu yöntem sizi uyarmaz.
demongolem

51

Microsoft, Powershell's Connections web sitesinde (2012-02-15, 16:40) , 3.0 sürümünde bu soruna bir çözüm olarak yeniden yönlendirmeyi genişlettiklerini açıklamıştır.

In PowerShell 3.0, we've extended output redirection to include the following streams: 
 Pipeline (1) 
 Error    (2) 
 Warning  (3) 
 Verbose  (4) 
 Debug    (5)
 All      (*)

We still use the same operators
 >    Redirect to a file and replace contents
 >>   Redirect to a file and append to existing content
 >&1  Merge with pipeline output

Ayrıntılar ve örnekler için "about_Redirection" yardım makalesine bakın.

help about_Redirection

1
Bu çözümü sevdiğimi söylemiyorum. Aslında, çirkin, hatırlanması zor ve esnek olmadığını düşünüyorum. Out- *, Set-Content ve Add-Content Cmdlet'lerine akış yakalama parametreleri eklemek gibi görünüyor. Bunlar varken, bir -PassThru parametresi de eklemelidirler. Bu da daha az faydalı olan Tee-Object Cmdlet'i eski haline getirecektir.
Nathan Hartley

Kafam karıştı, bu sorulan soruya nasıl cevap veriyor? "Bir PowerShell betiğinin yürütülmesi sırasında çıktısını nasıl yeniden yönlendirebilirim ?"
Zoredache

Haklısın, @Zoredache, "bu komut dosyasının adı değiştirilemez" gereksinimini göz ardı etmiş gibi görünüyor. Çıktının büyük bir kısmını yakalarken, Start-Transcript işte yoludur. Bu cevabı kaldırmalı mıyım?
Nathan Hartley

1
Genel yönlendirme için buraya gelenler için Powershell, o zamandan beri 3 Ocak 14 yorumuma doğrudan cevap veren -OutVariable -WarningVariable -ErrorVariable ekledi.
Nathan Hartley

2
Hayır, bırakmak iyi. Oyların sayısı göz önüne alındığında, açıkça faydalıdır. Bu soru neredeyse kesinlikle Google'ın komut dosyasının çağrılma şeklini değiştirebilen insanlardan isabet almasıdır.
Zoredache

36

kullanın:

Write "Stuff to write" | Out-File Outputfile.txt -Append

2
OP'nin sorusunu çözmez çünkü "yürütme sırasında" çalışmaz. Ama +1 verdim çünkü yine de Powershell'de nasıl boru yapılacağını bilmek yararlı.
Paul Masri-Stone

28

Değiştirebilirsin MyScript.ps1. Sonra şu şekilde değiştirmeyi deneyin:

$(
    Here is your current script
) *>&1 > output.txt

Bunu PowerShell 3 ile yeni denedim. Nathan Hartley'nin cevabındaki gibi tüm yönlendirme seçeneklerini kullanabilirsiniz .


Bu çözümü seviyorum. Eklemek için >> output.txt kullanabilirsiniz. Herkes bu unicode yerine ascii oluşturmak için bir yolu olup olmadığını biliyor musunuz?
Prof Von Lemongargle

1
Böyle bir şey deneyebilirsiniz: *>&1 | Out-File $log -Encoding ascii -Append -Width 132ancak çıktıyı tam olarak kontrol etmeniz gerekiyorsa Powershell gerçekten çirkin.
mplwork

Senaryosunda çalıştığı için bunu tercih ederim. Vagrant için mükemmel.
user3505901

25

Durumunuz izin veriyorsa olası bir çözüm:

  1. MyScript.ps1 dosyasını TheRealMyScript.ps1 olarak yeniden adlandırın
  2. Şuna benzeyen yeni bir MyScript.ps1 oluşturun:

    . \ TheRealMyScript.ps1> output.txt.


19
powershell ".\MyScript.ps1" > test.log

1
Bu benim komut dosyası çıktısı için çalışan birçok seçeneklerden sadece biriydi.
cori

17

Cmdlet Tee- Object'e bir göz atmak isteyebilirsiniz . Çıkışı Tee'ye bağlayabilirsiniz ve boru hattına ve ayrıca bir dosyaya yazacaktır


1
"çıktı" | Set-Content -PassThru ve "çıktı" | Add-Content -PassThru, Kodlama'yı ayarlayabileceğiniz ek avantajla Tee-Object gibi de çalışacaktır.
Nathan Hartley

16

Tüm çıktıların bir dosyaya doğrudan yönlendirilmesini istiyorsanız, şunu kullanmayı deneyin *>>:

# You'll receive standard output for the first command, and an error from the second command.
mkdir c:\temp -force *>> c:\my.log ;
mkdir c:\temp *>> c:\my.log ;

Bu, dosyaya düz bir yönlendirme olduğu için konsola çıkmaz (genellikle yararlıdır). Konsol çıkışını istiyorsanız, tüm çıktıları birleştirin *&>1ve ardından aşağıdakilerle borulayın Tee-Object:

mkdir c:\temp -force *>&1 | Tee-Object -Append -FilePath c:\my.log ;
mkdir c:\temp *>&1 | Tee-Object -Append -FilePath c:\my.log ;

# Shorter aliased version
mkdir c:\temp *>&1 | tee -Append c:\my.log ;

Bu tekniklerin PowerShell 3.0 veya sonraki sürümlerinde desteklendiğine inanıyorum; PowerShell 5.0 üzerinde test yapıyorum.


4

Komut satırından yapmak ve betiğin içinde yerleşik değilse, şunu kullanın:

.\myscript.ps1 | Out-File c:\output.csv

7
Asker, komut dosyası çağrısının değiştirilemeyeceğini açıkça açıklıyor.
Fer

3
Soru ile ilgili değil, ama benim için yararlı, Out-File için Boru ile doğru Sözdizimi almak için googling oldu.
gReX

0

Bunu betiğinize gömmek için şu şekilde yapabilirsiniz:

        Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append

Hile yapmalı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.