วิธีเปลี่ยนเส้นทางเอาต์พุตของ PowerShell ไปยังไฟล์ระหว่างการดำเนินการ


198

ฉันมีสคริปต์ PowerShell ซึ่งฉันต้องการจะเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์ ปัญหาคือฉันไม่สามารถเปลี่ยนวิธีเรียกสคริปต์นี้ได้ ดังนั้นฉันไม่สามารถทำ:

 .\MyScript.ps1 > output.txt

ฉันจะเปลี่ยนเส้นทางการส่งออกของสคริปต์ PowerShell ในระหว่างการดำเนินการได้อย่างไร

คำตอบ:


192

อาจStart-Transcriptจะทำงานให้คุณ ก่อนอื่นหยุดมันถ้ามันกำลังทำงานอยู่จากนั้นเริ่มมันแล้วหยุดมันเมื่อเสร็จแล้ว

$ ErrorActionPreference = "SilentlyContinue"
หยุดทรานสคริปต์ | ออกโมฆะ
$ ErrorActionPreference = "ดำเนินการต่อ"
Start-Transcript -path C: \ output.txt -append
# ทำบางสิ่งบางอย่าง
หยุด Transcript

นอกจากนี้คุณยังสามารถเรียกใช้สิ่งนี้ขณะทำงานกับสิ่งต่าง ๆ และให้มันบันทึกเซสชันบรรทัดคำสั่งของคุณเพื่อใช้อ้างอิงในภายหลัง

หากคุณต้องการระงับข้อผิดพลาดอย่างสมบูรณ์เมื่อพยายามหยุดการถอดเสียงที่ไม่ถอดเสียงคุณสามารถทำสิ่งนี้ได้:

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

13
โปรดทราบว่า start-transcript จะไม่บันทึก Write-Error, Write-Verbose หรือ Write-Debug ... เฉพาะเอาต์พุตมาตรฐาน
ริชาร์ด Berg

6
@ Richard: ดูเหมือนว่าจะทำตอนนี้ บางทีนี่อาจเป็นการเพิ่ม 2.0 แต่ไม่แน่ใจว่าคำตอบเหล่านี้ใช้ได้กับ 1.0 ทั้งหมดหรือไม่
Robert S Ciaccio

ฉันใช้รหัสเดียวกันเกือบด้านบน ปัญหาของฉันคือ Stop-Transcript | out-null ยังส่งเอาต์พุตข้อผิดพลาดหากการถอดเสียงไม่เริ่มขึ้น ฉันต้องกำจัดข้อความเพราะมันทำให้เลย์เอาต์ของฉันยุ่งเหยิง - ปฏิกิริยาการตอบสนองแบบเงียบ ๆ ก็ไม่ได้ช่วยอะไรเช่นกัน ความคิดใด ๆ
Mel

4
ที่สุดท้ายที่ผมพบเอกสารสำหรับการเริ่มต้น Transcript (เฉไฉไม่ติดป้ายชื่อด้วยหมายเลขรุ่น Powershell) มันบอกว่า "การถอดเสียงรวมคำสั่งทั้งหมดที่ผู้ใช้พิมพ์และเอาท์พุททั้งหมดที่ปรากฏบนคอนโซล" อย่างไรก็ตามฉันทดสอบ Start-Transcript ใน Powershell 2.0 และพบว่า @Richard ถูกต้องข้อผิดพลาดมาตรฐานจะไม่ถูกบันทึกลงในการถอดเสียง มันแย่มาก!
พันเอก Panic

วิธีนี้ดูเหมือนจะไม่เตือนคุณหากคุณมีสิทธิ์ในการเขียนไปยังตำแหน่งที่ระบุ
demongolem

51

Microsoft ได้ประกาศบนเว็บไซต์การเชื่อมต่อของ Powershell (2012-02-15 เวลา 16:40)ว่าในเวอร์ชัน 3.0 พวกเขาได้ขยายการเปลี่ยนเส้นทางเพื่อแก้ไขปัญหานี้

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

ดูบทความช่วยเหลือ "about_Redirection" เพื่อดูรายละเอียดและตัวอย่าง

help about_Redirection

1
ไม่ได้บอกว่าฉันชอบวิธีนี้ ในความเป็นจริงฉันพบว่ามันน่าเกลียดยากที่จะจำและไม่ยืดหยุ่น ดูเหมือนว่าการเพิ่มพารามิเตอร์การจับภาพสตรีมไปยัง Out- *, Set-Content และ Add-Content Cmdlets น่าจะทำได้ใน Powershelly มากขึ้น ในขณะที่พวกเขาอยู่ที่พวกเขาควรเพิ่มพารามิเตอร์ -PassThru ซึ่งจะทำให้ Tee-Object Cmdlet ที่มีประโยชน์น้อยกว่าล้าสมัย
นาธานฮาร์ทลี่ย์

ฉันสับสนคำถามนี้จะตอบคำถามที่ถามอย่างไร "ฉันจะเปลี่ยนเส้นทางการส่งออกของสคริปต์ PowerShell ในระหว่างการดำเนินการได้อย่างไร
Zoredache

คุณถูกต้อง @Zoredache ดูเหมือนว่าฉันจะมองข้ามความต้องการ "ไม่สามารถเปลี่ยนวิธีที่สคริปต์นี้เรียกว่า" ได้ เมื่อจับภาพเอาท์พุทส่วนใหญ่ Start-Transcript จะเป็นหนทางไป ฉันควรลบคำตอบนี้หรือไม่
Nathan Hartley

1
สำหรับผู้ที่มาที่นี่เพื่อเปลี่ยนเส้นทางทั่วไป Powershell ได้เพิ่ม -OutVariable -WarningVariable -ErrorVariable ซึ่งจะตอบคำวิจารณ์ของฉันในวันที่ 3 '14 โดยตรง
Nathan Hartley

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

36

ใช้:

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

2
ไม่สามารถแก้คำถามของ OP ได้เพราะมันไม่ทำงาน "ระหว่างการประมวลผล" แต่ฉันได้รับ +1 เพราะมันมีประโยชน์ที่จะรู้วิธีไปป์ใน Powershell
Paul Masri-Stone

28

MyScript.ps1ฉันจะเอามันคุณสามารถปรับเปลี่ยน จากนั้นลองเปลี่ยนให้เป็นดังนี้:

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

ฉันก็พยายามนี้กับ PowerShell 3. คุณสามารถใช้ตัวเลือกทั้งหมดของการเปลี่ยนเส้นทางในขณะที่คำตอบของนาธานฮาร์ทลี่


ฉันชอบวิธีนี้ คุณสามารถใช้ >> output.txt เพื่อผนวก ใครรู้ว่ามีวิธีที่จะสร้าง ASCII นี้แทน Unicode?
Prof Von Lemongargle

1
คุณอาจลองทำสิ่งนี้: *>&1 | Out-File $log -Encoding ascii -Append -Width 132Powershell น่าเกลียดมากถ้าคุณต้องการควบคุมเอาต์พุตอย่างแม่นยำ
mplwork

ฉันชอบสิ่งนี้เพราะมันทำงานในสคริปต์ของคุณ เหมาะสำหรับคนจรจัด
user3505901

25

วิธีแก้ปัญหาหนึ่งที่เป็นไปได้หากสถานการณ์ของคุณอนุญาต:

  1. เปลี่ยนชื่อ MyScript.ps1 เป็น TheRealMyScript.ps1
  2. สร้าง MyScript.ps1 ใหม่ที่มีลักษณะดังนี้:

    . \ TheRealMyScript.ps1> output.txt


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

1
นี่เป็นเพียงตัวเลือกมากมายที่ใช้งานได้กับเอาต์พุตสคริปต์ของฉัน
cori

17

คุณอาจต้องการที่จะดูที่การ cmdlet Tee-วัตถุ คุณสามารถไพพ์เอาต์พุตไปยัง Tee และมันจะเขียนไปยังไพพ์ไลน์และไปยังไฟล์


1
"เอาท์พุท" | Set-Content -PassThru และ "output" | Add-Content -PassThru จะทำงานเหมือน Tee-Object ด้วยสิทธิประโยชน์เพิ่มเติมที่คุณสามารถตั้งค่าการเข้ารหัส
Nathan Hartley

16

หากคุณต้องการเปลี่ยนเส้นทางของเอาต์พุตทั้งหมดไปยังไฟล์ให้ลองใช้*>>:

# 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 ;

เนื่องจากนี่เป็นการเปลี่ยนเส้นทางไปยังไฟล์โดยตรงจึงไม่ส่งออกไปยังคอนโซล (มักเป็นประโยชน์) หากคุณต้องการเอาต์พุตคอนโซลรวมเอาต์พุตทั้งหมดด้วย*&>1แล้วไพพ์ด้วย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 ;

ฉันเชื่อว่าเทคนิคเหล่านี้ได้รับการสนับสนุนใน PowerShell 3.0 หรือใหม่กว่า ฉันกำลังทดสอบ PowerShell 5.0


4

หากคุณต้องการทำจากบรรทัดคำสั่งและไม่ได้สร้างไว้ในสคริปต์ให้ใช้:

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

7
ผู้ถามอธิบายอย่างชัดเจนว่าไม่สามารถเปลี่ยนการเรียกสคริปต์ได้
Fer

2
ไม่เกี่ยวข้องกับคำถาม แต่มีประโยชน์สำหรับฉันฉัน googling เพื่อให้ได้ไวยากรณ์ที่ถูกต้องกับ Pipe to Out-File
gReX

0

หากต้องการฝังสิ่งนี้ในสคริปต์ของคุณคุณสามารถทำสิ่งนี้ได้:

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

นั่นควรทำเคล็ดลับ

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