当我的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"
非常感谢任何协助。
答案 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
选项)