เมื่อใช้ Windows Server 2008 ฉันจะจับเอาต์พุตของสคริปต์ที่รันด้วยตัวกำหนดตารางเวลางาน windows ได้อย่างไร
ฉันกำลังทดสอบชุดสคริปต์การพิมพ์แบบกำหนดเองที่ค่อนข้างยาวและเพื่อวัตถุประสงค์ในการดีบักฉันต้องการดูผลลัพธ์ทั้งหมดจากมันทุกคืน
เมื่อใช้ Windows Server 2008 ฉันจะจับเอาต์พุตของสคริปต์ที่รันด้วยตัวกำหนดตารางเวลางาน windows ได้อย่างไร
ฉันกำลังทดสอบชุดสคริปต์การพิมพ์แบบกำหนดเองที่ค่อนข้างยาวและเพื่อวัตถุประสงค์ในการดีบักฉันต้องการดูผลลัพธ์ทั้งหมดจากมันทุกคืน
คำตอบ:
ลองใช้เป็นสตริงคำสั่งใน Task Scheduler:
cmd /c yourscript.cmd > logall.txt
cmd /c "path with spaces/command.cmd > file.txt"
หากคุณมีช่องว่าง 2>&1
จากคำตอบของอีวานยังไปภายในคำพูด
cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
ด้วย stderr (ซึ่งข้อผิดพลาดส่วนใหญ่ไปที่):
cmd /c yourscript.cmd > logall.txt 2>&1
ไฟล์นี้>>
จะต่อท้ายไฟล์บันทึกแทนที่จะเขียนทับในแต่ละครั้ง 2>&1
ยังจะส่งข้อผิดพลาดไปยังแฟ้มบันทึกของคุณ
cmd /c YourProgram.exe >> log.txt 2>&1
คุณสามารถมี debug.cmd ที่เรียก yourscript.cmd
yourscript.cmd > logall.txt
คุณตั้งเวลา debug.cmd แทน yourscript.cmd
cmd.exe
ตัวประมวลผลคำสั่งเพื่อสร้างชื่อไฟล์ที่ประทับเวลาเพื่อบันทึกเอาต์พุตของภารกิจที่กำหนดเวลาไว้ในการสร้างคำตอบจากผู้อื่นที่นี่คุณอาจต้องการสร้างไฟล์เอาต์พุตที่มีวันที่และ / หรือเวลาฝังอยู่ในชื่อของไฟล์ คุณสามารถใช้cmd.exe
ตัวประมวลผลคำสั่งเพื่อทำสิ่งนี้ให้คุณ
หมายเหตุ:เทคนิคนี้ใช้เอาต์พุตสตริงของตัวแปรสภาพแวดล้อม Windows ภายในและแบ่งส่วนต่างๆตามตำแหน่งอักขระ ด้วยเหตุนี้ค่าที่ระบุในตัวอย่างด้านล่างอาจไม่ถูกต้องสำหรับพื้นที่ของ Windows ที่คุณใช้ นอกจากนี้ด้วยการตั้งค่าภูมิภาคบางองค์ประกอบของวันที่หรือเวลาอาจเพิ่มช่องว่างในชื่อไฟล์ที่สร้างขึ้นเมื่อค่าน้อยกว่า 10 เพื่อบรรเทาปัญหานี้ให้ล้อมรอบชื่อไฟล์ของคุณด้วยเครื่องหมายคำพูดเพื่อให้มีช่องว่างที่ไม่ได้ตั้งใจในไฟล์ ชื่อจะไม่ทำลายบรรทัดคำสั่งที่คุณกำลังสร้าง ทดลองและค้นหาสิ่งที่ดีที่สุดสำหรับสถานการณ์ของคุณ
พึงทราบว่าPowerShell
มีพลังมากกว่าcmd.exe
. วิธีหนึ่งที่มีประสิทธิภาพมากกว่าคือสามารถจัดการกับภูมิภาคต่างๆของ Windows ได้ แต่คำตอบนี้เกี่ยวกับการแก้ปัญหานี้โดยใช้cmd.exe
ไม่ใช่PowerShell
ดังนั้นเราจึงดำเนินการต่อ
การใช้ cmd.exe
คุณสามารถเข้าถึงส่วนประกอบต่างๆของวันที่และเวลาได้โดยการแบ่งตัวแปรสภาพแวดล้อมภายใน%date%
และ%time%
ดังต่อไปนี้ (อีกครั้งค่าการแบ่งส่วนที่แน่นอนจะขึ้นอยู่กับภูมิภาคที่กำหนดค่าใน Windows):
%date:~10,4%
%date:~4,2%
%date:~7,2%
%time:~0,2%
%time:~3,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
คุณสามารถเขียนลงในไฟล์บันทึกในบรรทัดที่คุณต้องการส่งออกดังนี้:
@echo off
echo Debugging started >C:\logfile.txt
echo More stuff
echo Debugging stuff >>C:\logfile.txt
echo Hope this helps! >>C:\logfile.txt
ด้วยวิธีนี้คุณสามารถเลือกคำสั่งที่จะส่งออกได้หากคุณไม่ต้องการลากผ่านทุกอย่างเพียงแค่ได้รับสิ่งที่คุณต้องการเห็น >
ออกจะเป็นไฟล์ที่ระบุไว้ (การสร้างไฟล์ถ้ามันไม่ได้อยู่และเขียนทับมันถ้ามันไม่) >>
จะผนวกกับแฟ้มที่ระบุ (การสร้างไฟล์ถ้ามันไม่ได้อยู่ แต่ผนวกกับเนื้อหาถ้ามันไม่)
ตัวอย่างวิธีการรันโปรแกรมและเขียน 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
และด้านในใช้เครื่องหมายคำพูดคู่ตามปกติ โปรดทราบว่าวันที่ขึ้นอยู่กับสถานที่ตัวอย่างนี้ใช้งานได้โดยใช้ภาษาของสหรัฐอเมริกา
ข้อมูลโค้ดนี้ใช้ 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%