上下文:我有一个批处理文件,作为计划任务定期运行。虽然我可以echo
通过直接从 Cmd.exe 命令提示符窗口调用它来使用语句进行调试,但如果我可以OutputDebugString
从批处理文件中调用,我大概可以使用以下方式监视计划任务:调试视图++或类似的东西。
这可能吗?我想我可以通过调用一个 3 行 Python 程序来实现这一点,但我想知道是否有一种影响较小的方法。
答案1
我最终得到了这个批处理-Python混合版本:
ODS.BAT文件
@SETLOCAL ENABLEDELAYEDEXPANSION & python -x "%~f0" %* & EXIT /B !ERRORLEVEL!
#============================================================================
import sys, win32api, shlex
#============================================================================
def ODS (S):
win32api.OutputDebugString ("Batch: " + S)
return
#============================================================================
cmdline = " ".join(map(shlex.quote, sys.argv[1:]))
ODS (cmdline)
exit (0)
然而性能并不出色——在 2.4GHz 的 i7-4700MQ 上,调用开销约为 120 毫秒。
6993.558805 2021/01/03 00:57:01.217 78472 python.exe Batch: first call
6993.710674 2021/01/03 00:57:01.369 77512 python.exe Batch: second call
6993.846577 2021/01/03 00:57:01.505 12548 python.exe Batch: 3
6993.991280 2021/01/03 00:57:01.649 18540 python.exe Batch: 4
6994.139500 2021/01/03 00:57:01.797 41688 python.exe Batch: 5
6994.279880 2021/01/03 00:57:01.938 86844 python.exe Batch: 6
6994.420741 2021/01/03 00:57:02.079 73856 python.exe Batch: 7
6994.566055 2021/01/03 00:57:02.225 86064 python.exe Batch: 8
6994.735341 2021/01/03 00:57:02.394 69644 python.exe Batch: 9
6994.888729 2021/01/03 00:57:02.547 46524 python.exe Batch: 10
6995.212918 2021/01/03 00:57:02.871 88856 python.exe Batch: 12
出于好奇,我尝试了这个:
文件 ODSEcho.bat
@echo %Date% %Time% Batch: %*
@exit /b %ErrorLevel%
这个的开销是~7mS!
2021-01-03 0:57:02.89 Batch: first call
2021-01-03 0:57:02.90 Batch: second call
2021-01-03 0:57:02.90 Batch: 3
2021-01-03 0:57:02.91 Batch: 4
2021-01-03 0:57:02.91 Batch: 5
2021-01-03 0:57:02.92 Batch: 6
2021-01-03 0:57:02.93 Batch: 7
2021-01-03 0:57:02.94 Batch: 8
2021-01-03 0:57:02.94 Batch: 9
2021-01-03 0:57:02.95 Batch: 10
(想想看……)。我假设 Python 解释器的加载是罪魁祸首。
(尽管纯批处理解决方案速度更快,但它不会将其输出流发送到驻留调试器,而这正是本练习的目的)。
如果有时间我会尝试其他的(VBS、Powershell)。