如果程序通过批处理脚本运行,如何启动wav文件

时间:2012-01-28 15:09:48

标签: windows command-line batch-file

当我的vpn客户端断开连接时,我正在尝试播放wav文件。

遵照来自How to check if a process is running via a batch script

的Matt Lacey的建议

我有以下内容:

del search.log
tasklist /FI "WINDOWTITLE eq VPN Client" /FO CSV > search.log
FOR /F %%A IN (search.log) DO IF %%~zA EQU 0 GOTO end
start alarm.wav
:end

当search.log的内容为空时,alarm.wav播放 但是当search.log为空时我不希望它播放。我希望它在search.log中包含信息时播放,例如:

"Image Name","PID","Session Name","Session#","Mem Usage"
"vpngui.exe","2408","Console","0","10,496 K"

非常感谢任何协助。

2 个答案:

答案 0 :(得分:1)

您可以使用FIND命令测试日志文件的实际内容,然后根据测试结果执行所需的操作。方法如下:

del search.log
tasklist /FI "WINDOWTITLE eq VPN Client" /FO CSV > search.log
FIND ".exe" < search.log > NUL && start alarm.wav

FIND命令将在日志文件中搜索.exe字符串。 (如果上一个命令确实在进程列表中找到了所请求的程序,你会期望它包含.exe。)此时实际行并不重要,所以我们放弃了{{ 1}}的输出(FIND)。什么 重要的是这条线是否完全找到了。如果是,则将调用> NUL之后的命令,即&&。如果没有,就不会有警报。

答案 1 :(得分:1)

Matt Lacey解决方案想要在进程未运行时执行某些操作。因此它检查输出的大小是否为0长度(意味着没有找到进程)

如果进程正在运行,您希望执行某些操作,因此您的逻辑会被反转。您需要检查输出是否为&lt;&gt; 0(意味着必须找到一个过程)

del search.log
tasklist /FI "WINDOWTITLE eq VPN Client" /FO CSV > search.log
FOR /F %%A IN (search.log) DO IF %%~zA NEQ 0 GOTO end
start alarm.wav
:end

可以修改它以便在不需要输出文件的情况下工作。请注意,如果找到进程,TASKLIST的输出将是多行,但您只想播放一次警报,因此需要GOTO。

for /f %%a in ('tasklist /FI "WINDOWTITLE eq VPN Client" /FO CSV') do (
  start alarm.wav
  goto :break
)
:break

注意 - Matt Lacey解决方案依赖于TASKLIST命令在找不到进程时不会产生任何输出的事实。这在XP上工作正常。但是在Vista上,如果找不到匹配的进程,TASKLIST将生成以下行 - “INFO:没有正在运行的任务符合指定的条件。”

要使该过程适用于任何版本的Windows,您需要按照Andriy M建议的方式执行某些操作。这是一个不需要输出文件的变体

tasklist /FI "WINDOWTITLE eq VPN Client" /FO CSV | FIND /I ".exe" >nul && start alarm.wav

|是管道运营商。它导致TASKLIST命令的输出直接作为FIND命令的输入进行管道传输。

(编辑 - 在可执行文件名使用大写的情况下添加/I选项)