如何从 Windows 批处理文件中调用 OutputDebugString

如何从 Windows 批处理文件中调用 OutputDebugString

上下文:我有一个批处理文件,作为计划任务定期运行。虽然我可以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)。

相关内容