ฉันจะจับเอาต์พุตของสคริปต์ได้อย่างไรหากถูกรันโดยตัวกำหนดตารางเวลางาน


98

เมื่อใช้ Windows Server 2008 ฉันจะจับเอาต์พุตของสคริปต์ที่รันด้วยตัวกำหนดตารางเวลางาน windows ได้อย่างไร

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


2
บางครั้งสิ่งนี้จะใช้ไม่ได้เช่นไม่มีการสร้างไฟล์บันทึก สถานการณ์หนึ่งที่สามารถนำไปสู่กรณีนี้คือเมื่องานไม่ได้เริ่มต้นเลยเนื่องจาก Windows เข้าใจผิดคิดว่ายังคงทำงานอยู่ คุณสามารถติดตามสิ่งนั้นได้โดยคลิกที่ประวัติงาน (แท็บประวัติในคุณสมบัติงาน - ข้อมูลอาจใช้เวลาสองสามวินาทีในการแสดง)
Daniel

คำตอบ:


87

ลองใช้เป็นสตริงคำสั่งใน Task Scheduler:

cmd /c yourscript.cmd > logall.txt

2
ดีไม่ต้องใช้กระดาษห่อหุ้มใช้งานได้ดีและยังบันทึกเอาต์พุตจากสคริปต์ powershell ลูกที่เรียกจาก bat / cmd ที่เรียกใช้งานตัวกำหนดตารางเวลาขอบคุณ!
Jonesome Reinstate Monica

9
นอกจากนี้ให้ใช้cmd /c "path with spaces/command.cmd > file.txt"หากคุณมีช่องว่าง 2>&1จากคำตอบของอีวานยังไปภายในคำพูด
Dinei

3
จำเป็นต้องใช้เครื่องหมายคำพูดคู่เพื่อให้ฉันทำงานได้: stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo

1
ฉันรู้ว่ามันเป็นเวลา 5 ปีแล้ว แต่การเปลี่ยนสิ่งนี้เป็นคำตอบที่ได้รับการยอมรับว่าเป็นวิธีที่เรียบง่ายในการปฏิบัติงาน
Mechaflash

ตอนนี้ฉันมีหน้าต่างคำสั่งปรากฏขึ้นเมื่อเรียกใช้งาน จะป้องกันได้อย่างไร?
คริส


56

เพื่อเสริมคำตอบของ @ user2744787 นี่คือภาพหน้าจอเพื่อแสดงวิธีใช้cmdกับอาร์กิวเมนต์ในงานตามกำหนดการ:

กำหนดการส่งออกงาน cmd ไปยังไฟล์บันทึก

โปรแกรม / สคริปต์: cmd

เพิ่มอาร์กิวเมนต์: /c run_with_default_port.bat > IMQuantWebServices.log


5
ดูเหมือนว่าคุณกำลังเริ่มบริการผ่านภารกิจที่กำหนดไว้ หากนี่ควรเป็นบริการที่ทำงานอยู่เบื้องหลังอย่างต่อเนื่องให้ดูที่ NSSM เป็นทางเลือกอื่น มันรันคำสั่งใด ๆ เป็นบริการ windows และจัดการรีสตาร์ทหลังจากความล้มเหลวเป็นต้น
leemes

43

ไฟล์นี้>>จะต่อท้ายไฟล์บันทึกแทนที่จะเขียนทับในแต่ละครั้ง 2>&1ยังจะส่งข้อผิดพลาดไปยังแฟ้มบันทึกของคุณ

cmd /c YourProgram.exe >> log.txt 2>&1

40

คุณสามารถมี debug.cmd ที่เรียก yourscript.cmd

yourscript.cmd > logall.txt

คุณตั้งเวลา debug.cmd แทน yourscript.cmd


11

ใช้cmd.exeตัวประมวลผลคำสั่งเพื่อสร้างชื่อไฟล์ที่ประทับเวลาเพื่อบันทึกเอาต์พุตของภารกิจที่กำหนดเวลาไว้

ในการสร้างคำตอบจากผู้อื่นที่นี่คุณอาจต้องการสร้างไฟล์เอาต์พุตที่มีวันที่และ / หรือเวลาฝังอยู่ในชื่อของไฟล์ คุณสามารถใช้cmd.exeตัวประมวลผลคำสั่งเพื่อทำสิ่งนี้ให้คุณ

หมายเหตุ:เทคนิคนี้ใช้เอาต์พุตสตริงของตัวแปรสภาพแวดล้อม Windows ภายในและแบ่งส่วนต่างๆตามตำแหน่งอักขระ ด้วยเหตุนี้ค่าที่ระบุในตัวอย่างด้านล่างอาจไม่ถูกต้องสำหรับพื้นที่ของ Windows ที่คุณใช้ นอกจากนี้ด้วยการตั้งค่าภูมิภาคบางองค์ประกอบของวันที่หรือเวลาอาจเพิ่มช่องว่างในชื่อไฟล์ที่สร้างขึ้นเมื่อค่าน้อยกว่า 10 เพื่อบรรเทาปัญหานี้ให้ล้อมรอบชื่อไฟล์ของคุณด้วยเครื่องหมายคำพูดเพื่อให้มีช่องว่างที่ไม่ได้ตั้งใจในไฟล์ ชื่อจะไม่ทำลายบรรทัดคำสั่งที่คุณกำลังสร้าง ทดลองและค้นหาสิ่งที่ดีที่สุดสำหรับสถานการณ์ของคุณ

พึงทราบว่าPowerShellมีพลังมากกว่าcmd.exe. วิธีหนึ่งที่มีประสิทธิภาพมากกว่าคือสามารถจัดการกับภูมิภาคต่างๆของ Windows ได้ แต่คำตอบนี้เกี่ยวกับการแก้ปัญหานี้โดยใช้cmd.exeไม่ใช่PowerShellดังนั้นเราจึงดำเนินการต่อ

การใช้ cmd.exe

คุณสามารถเข้าถึงส่วนประกอบต่างๆของวันที่และเวลาได้โดยการแบ่งตัวแปรสภาพแวดล้อมภายใน%date%และ%time%ดังต่อไปนี้ (อีกครั้งค่าการแบ่งส่วนที่แน่นอนจะขึ้นอยู่กับภูมิภาคที่กำหนดค่าใน Windows):

  • ปี (4 หลัก): %date:~10,4%
  • เดือน (2 หลัก): %date:~4,2%
  • วัน (2 หลัก): %date:~7,2%
  • ชั่วโมง (2 หลัก): %time:~0,2%
  • นาที (2 หลัก): %time:~3,2%
  • วินาที (2 หลัก): %time:~6,2%

สมมติว่าคุณต้องการตั้งชื่อไฟล์บันทึกโดยใช้รูปแบบวันที่ / เวลานี้: " Log_[yyyyMMdd]_[hhmmss].txt" คุณจะใช้สิ่งต่อไปนี้:

Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt

ในการทดสอบสิ่งนี้ให้รันบรรทัดคำสั่งต่อไปนี้:

cmd.exe /c echo "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"

รวมทุกอย่างเข้าด้วยกันเพื่อเปลี่ยนเส้นทางทั้งสองstdoutและstderrจากสคริปต์ของคุณไปยังไฟล์บันทึกที่มีวันที่และเวลาปัจจุบันการใช้งานอาจใช้สิ่งต่อไปนี้เป็นบรรทัดคำสั่งของคุณ:

cmd /c YourProgram.cmd > "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1

สังเกตการใช้เครื่องหมายคำพูดรอบชื่อไฟล์เพื่อจัดการกับอินสแตนซ์ส่วนประกอบวันที่หรือเวลาอาจแนะนำอักขระช่องว่าง

ในกรณีของฉันถ้าวันที่ / เวลาปัจจุบันคือ 10/05/2017 9:05:34 น. บรรทัดคำสั่งด้านบนจะสร้างสิ่งต่อไปนี้:

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1

ไม่มีศูนย์นำหน้าในชั่วโมงที่น้อยกว่า 10: / ไม่แน่ใจว่าจะแก้ไขอย่างไร แต่อย่างน้อยก็อ้างชื่อไฟล์
user25064

9

คุณสามารถเขียนลงในไฟล์บันทึกในบรรทัดที่คุณต้องการส่งออกดังนี้:

@echo off
echo Debugging started >C:\logfile.txt
echo More stuff
echo Debugging stuff >>C:\logfile.txt
echo Hope this helps! >>C:\logfile.txt

ด้วยวิธีนี้คุณสามารถเลือกคำสั่งที่จะส่งออกได้หากคุณไม่ต้องการลากผ่านทุกอย่างเพียงแค่ได้รับสิ่งที่คุณต้องการเห็น >ออกจะเป็นไฟล์ที่ระบุไว้ (การสร้างไฟล์ถ้ามันไม่ได้อยู่และเขียนทับมันถ้ามันไม่) >>จะผนวกกับแฟ้มที่ระบุ (การสร้างไฟล์ถ้ามันไม่ได้อยู่ แต่ผนวกกับเนื้อหาถ้ามันไม่)


2

ตัวอย่างวิธีการรันโปรแกรมและเขียน stdout และ stderr ไปยังไฟล์ด้วยการประทับเวลา:

cmd /c ""C:\Program Files (x86)\program.exe" -param fooo >> "c:\dir space\Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1"

ส่วนสำคัญคือการอ้างสองครั้งทั้งส่วนด้านหลังcmd /cและด้านในใช้เครื่องหมายคำพูดคู่ตามปกติ โปรดทราบว่าวันที่ขึ้นอยู่กับสถานที่ตัวอย่างนี้ใช้งานได้โดยใช้ภาษาของสหรัฐอเมริกา


0

ข้อมูลโค้ดนี้ใช้ wmic.exe เพื่อสร้างสตริงวันที่ มันไม่ยุ่งเหยิงด้วยการตั้งค่าสถานที่

rem DATE as YYYY-MM-DD via WMIC.EXE
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
set RDATE=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2% 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.