Làm cách nào để nắm bắt đầu ra của một tập lệnh nếu nó đang được chạy bởi bộ lập lịch tác vụ?


95

Sử dụng Windows Server 2008, làm cách nào để bắt đầu ra của một tập lệnh đang được chạy với bộ lập lịch tác vụ windows?

Tôi đang thử nghiệm một tập lệnh hàng loạt in tùy chỉnh khá dài và cho mục đích gỡ lỗi, tôi muốn xem tất cả kết quả đầu ra từ nó mỗi đêm.


2
Đôi khi, điều này sẽ không hoạt động tức là không có tệp nhật ký nào được tạo. Một tình huống có thể dẫn đến điều này là khi tác vụ hoàn toàn không bắt đầu, vì Windows nhầm tưởng rằng nó vẫn đang chạy. Bạn có thể theo dõi điều đó bằng cách đăng nhập lịch sử nhiệm vụ (tab lịch sử trong thuộc tính nhiệm vụ - thông tin có thể mất vài giây để hiển thị)
Daniel

Câu trả lời:


83

Hãy thử điều này dưới dạng chuỗi lệnh trong Trình lập lịch tác vụ:

cmd /c yourscript.cmd > logall.txt

2
đẹp, không yêu cầu trình bao bọc, hoạt động tốt và cũng ghi lại kết quả đầu ra từ các tập lệnh quyền hạn con được gọi từ bat / cmd được kích hoạt bởi bộ lập lịch tác vụ Cảm ơn!
Jonesome Phục hồi Monica

8
Ngoài ra, hãy sử dụng cmd /c "path with spaces/command.cmd > file.txt"nếu bạn có khoảng trắng. Các 2>&1từ câu trả lời của Ivan cũng đi bên trong dấu ngoặc kép.
Dinei

3
cần sử dụng dấu ngoặc kép để khiến mỏ của tôi hoạt động: stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo

1
Tôi biết đã 5 năm, nhưng thay đổi điều này thành câu trả lời được chấp nhận vì đó là cách tối giản để thực hiện nhiệm vụ.
Mechaflash

Bây giờ tôi có một cửa sổ lệnh hiển thị khi chạy tác vụ. Làm thế nào để ngăn chặn điều đó?
Chris

57

Với stderr (nơi hầu hết các lỗi xảy ra):

cmd /c yourscript.cmd > logall.txt 2>&1

56

Để bổ sung câu trả lời của @ user2744787, đây là ảnh chụp màn hình để hiển thị cách sử dụng cmdvới các đối số trong Tác vụ đã lên lịch:

Đã lên lịch xuất cmd Nhiệm vụ thành logfile

Chương trình / kịch bản: cmd

Thêm đối số: /c run_with_default_port.bat > IMQuantWebServices.log


5
Có vẻ như bạn đang bắt đầu một dịch vụ thông qua một tác vụ đã lên lịch. Nếu đây phải là một dịch vụ chạy liên tục trong nền, hãy xem NSSM như một giải pháp thay thế. Nó chạy bất kỳ lệnh nào dưới dạng dịch vụ cửa sổ và xử lý việc khởi động lại sau khi bị lỗi, v.v.
leemes

43

Hành động >>sẽ nối tệp nhật ký, thay vì ghi đè tệp đó mỗi lần. Nó 2>&1cũng sẽ gửi lỗi đến tệp nhật ký của bạn.

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

39

Bạn có thể có một debug.cmd gọi là yourcript.cmd

yourscript.cmd > logall.txt

bạn lên lịch debug.cmd thay vì yourcript.cmd


10

Sử dụng cmd.exe bộ xử lý lệnh để tạo tên tệp được đánh dấu thời gian để ghi lại kết quả của tác vụ đã lên lịch của bạn

Để xây dựng câu trả lời của những người khác ở đây, có thể bạn muốn tạo một tệp đầu ra có ngày và / hoặc giờ được nhúng vào tên của tệp. Bạn có thể sử dụng cmd.exebộ xử lý lệnh để thực hiện việc này cho mình.

Ghi chú: Kỹ thuật này lấy kết quả đầu ra là chuỗi của các biến môi trường Windows nội bộ và cắt chúng ra dựa trên vị trí ký tự. Do đó, các giá trị chính xác được cung cấp trong các ví dụ bên dưới có thể không đúng với vùng Windows bạn sử dụng. Ngoài ra, với một số cài đặt khu vực, một số thành phần của ngày hoặc giờ có thể giới thiệu một khoảng trắng trong tên tệp đã tạo khi giá trị của chúng nhỏ hơn 10. Để giảm thiểu vấn đề này, hãy đặt tên tệp của bạn bằng dấu ngoặc kép để có bất kỳ khoảng trống không mong muốn nào trong tệp tên sẽ không phá vỡ dòng lệnh bạn đang xây dựng. Thử nghiệm và tìm những gì phù hợp nhất với tình huống của bạn.

Hãy biết rằng PowerShellnó mạnh hơn cmd.exe. Một cách mạnh mẽ hơn là nó có thể xử lý các vùng Windows khác nhau. Nhưng câu trả lời này là về việc giải quyết vấn đề này bằng cách sử dụng cmd.exe, không phải PowerShell, vì vậy chúng tôi tiếp tục.

Sử dụng cmd.exe

Bạn có thể truy cập các thành phần khác nhau của ngày và giờ bằng cách cắt các biến môi trường bên trong %date%%time%như sau (một lần nữa, các giá trị cắt chính xác phụ thuộc vào vùng được định cấu hình trong Windows):

  • Năm (4 chữ số): %date:~10,4%
  • Tháng (2 chữ số): %date:~4,2%
  • Ngày (2 chữ số): %date:~7,2%
  • Giờ (2 chữ số): %time:~0,2%
  • Phút (2 chữ số): %time:~3,2%
  • Thứ hai (2 chữ số): %time:~6,2%

Giả sử bạn muốn tệp nhật ký của mình được đặt tên bằng định dạng ngày / giờ này: " Log_[yyyyMMdd]_[hhmmss].txt". Bạn sẽ sử dụng như sau:

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

Để kiểm tra điều này, hãy chạy dòng lệnh sau:

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

Tập hợp tất cả lại với nhau, để chuyển hướng cả stdoutstderrtừ tập lệnh của bạn đến tệp nhật ký có tên ngày và giờ hiện tại, sử dụng có thể sử dụng dòng lệnh sau làm dòng lệnh của bạn:

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

Lưu ý việc sử dụng các dấu ngoặc kép xung quanh tên tệp để xử lý các trường hợp một thành phần ngày hoặc giờ có thể giới thiệu một ký tự khoảng trắng.

Trong trường hợp của tôi, nếu ngày / giờ hiện tại là 10/05/2017 9:05:34 AM, dòng lệnh trên sẽ tạo ra như sau:

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

không có hàng đầu zero vào giờ ít hơn 10: / không chắc chắn làm thế nào để sửa chữa nhưng ít nhất trích dẫn tên tập tin
user25064

9

Bạn có thể ghi vào tệp nhật ký trên các dòng mà bạn muốn xuất như thế này:

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

Bằng cách này, bạn có thể chọn các lệnh để xuất nếu bạn không muốn lướt qua mọi thứ, chỉ cần lấy những gì bạn cần xem. Nó >sẽ xuất nó thành tệp được chỉ định (tạo tệp nếu nó không tồn tại và ghi đè lên nếu có). Di >>chúc sẽ thêm vào tệp được chỉ định (tạo tệp nếu tệp không tồn tại nhưng nối vào nội dung nếu có).


1

Ví dụ về cách chạy chương trình và ghi stdout và stderr vào tệp có dấu thời gian:

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"

Phần quan trọng là trích dẫn kép toàn bộ phần phía sau cmd /cvà bên trong nó sử dụng dấu ngoặc kép như bình thường. Cũng lưu ý rằng ngày phụ thuộc vào ngôn ngữ, ví dụ này hoạt động khi sử dụng ngôn ngữ của Hoa Kỳ.


0

Đoạn mã này sử dụng wmic.exe để tạo chuỗi ngày. Nó không bị xáo trộn bởi cài đặt ngôn ngữ

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% 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.