How do I capture the output of a script if it is being ran by the task scheduler?

前端 未结 9 712
旧巷少年郎
旧巷少年郎 2020-12-02 08:37

Using Windows Server 2008, how do I go about capturing the output of a script that is being ran with the windows task scheduler?

I\'m testing a rather long custom pr

相关标签:
9条回答
  • 2020-12-02 09:06

    Use the cmd.exe command processor to build a timestamped file name to log your scheduled task's output

    To build upon answers by others here, it may be that you want to create an output file that has the date and/or time embedded in the name of the file. You can use the cmd.exe command processor to do this for you.

    Note: This technique takes the string output of internal Windows environment variables and slices them up based on character position. Because of this, the exact values supplied in the examples below may not be correct for the region of Windows you use. Also, with some regional settings, some components of the date or time may introduce a space into the constructed file name when their value is less than 10. To mitigate this issue, surround your file name with quotes so that any unintended spaces in the file name won't break the command-line you're constructing. Experiment and find what works best for your situation.

    Be aware that PowerShell is more powerful than cmd.exe. One way it is more powerful is that it can deal with different Windows regions. But this answer is about solving this issue using cmd.exe, not PowerShell, so we continue.

    Using cmd.exe

    You can access different components of the date and time by slicing the internal environment variables %date% and %time%, as follows (again, the exact slicing values are dependent on the region configured in Windows):

    • Year (4 digits): %date:~10,4%
    • Month (2 digits): %date:~4,2%
    • Day (2 digits): %date:~7,2%
    • Hour (2 digits): %time:~0,2%
    • Minute (2 digits): %time:~3,2%
    • Second (2 digits): %time:~6,2%

    Suppose you want your log file to be named using this date/time format: "Log_[yyyyMMdd]_[hhmmss].txt". You'd use the following:

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

    To test this, run the following command line:

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

    Putting it all together, to redirect both stdout and stderr from your script to a log file named with the current date and time, use might use the following as your command line:

    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
    

    Note the use of quotes around the file name to handle instances a date or time component may introduce a space character.

    In my case, if the current date/time were 10/05/2017 9:05:34 AM, the above command-line would produce the following:

    cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1
    
    0 讨论(0)
  • 2020-12-02 09:14

    The >> will append the log file, rather than overwriting it each time. The 2>&1 will also send errors to your log file.

    cmd /c YourProgram.exe >> log.txt 2>&1
    
    0 讨论(0)
  • 2020-12-02 09:19

    To supplement @user2744787's answer, here is a screenshot to show how to use cmd with arguments in a Scheduled Task:

    Program/script: cmd

    Add arguments: /c run_with_default_port.bat > IMQuantWebServices.log

    0 讨论(0)
  • 2020-12-02 09:19

    This snippet uses wmic.exe to build the date string. It isn't mangled by locale settings

    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% 
    
    0 讨论(0)
  • 2020-12-02 09:24

    Try this as the command string in Task Scheduler:

    cmd /c yourscript.cmd > logall.txt
    
    0 讨论(0)
  • 2020-12-02 09:25

    With stderr (where most of the errors go to):

    cmd /c yourscript.cmd > logall.txt 2>&1
    
    0 讨论(0)
提交回复
热议问题