检查 Windows 批处理文件中是不是经过了 20 秒
Posted
技术标签:
【中文标题】检查 Windows 批处理文件中是不是经过了 20 秒【英文标题】:Check if 20 seconds have passed in Windows Batch file检查 Windows 批处理文件中是否经过了 20 秒 【发布时间】:2014-04-21 04:33:30 【问题描述】:每当我收到一封符合标准的电子邮件时,我都会运行一个批处理文件,该文件会获取一条信息并将其与一个文件进行比较,然后将该信息写入两个文件并播放声音。
我想做的是,如果自上次文件更新 (new_follower.txt) 以来还没有过去 20 秒,那么不要播放声音。 (反复播放会很烦人。)
这是我的文件。
@ECHO OFF
SET "str=%1%,"
SET str=%str: is now following you on Twitch=%
SET str=%str:"=%
find /c "%str%" "D:\~MY STUFF\Live Stream!\keep_listr.txt"
if %errorlevel% equ 1 goto notfound
goto done
:notfound
ECHO %str% >> "D:\~MY STUFF\Live Stream!\new_follower.txt"
ECHO %str% >> "D:\~MY STUFF\Live Stream!\keep_listr.txt"
"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe" --play-and-exit "D:\~MY STUFF\Live Stream!\Donation Alerts\surf.wav"
echo %str%
goto done
:done
另外,在 Windows 7 中,有没有一种方法可以播放声音,而无需像我目前正在做的那样启动应用程序?
提前致谢
【问题讨论】:
没有简单的原生批处理方式。您可以将%time%
转换为秒(忽略午夜翻转)并跟踪经过的时间。 VBS 脚本可能有播放声音文件的方法。
播放器:superuser.com/questions/539646/…
wsh2.uw.hu/ch14g.html
echo ^g(注意是 Ctrl + G 而不是 ^ 然后 g)。
批量/VBS 播放 MP3/Wav 声音:***.com/questions/20418730/batch-file-to-play-a-song/…
【参考方案1】:
由于目标操作系统是 Windows 7,此代码使用forfiles
以秒为单位检索文件时间。其余代码来自我正在使用的“运行时间计”。它将处理午夜翻转,但不会测试多天的时差。根据需要进行调整。这只是返回当前批处理文件的年龄(以秒为单位),并且该值格式化为通常的时间字符串。
@echo off
setlocal enableextensions disabledelayedexpansion
call :getFileTime "%~f0" fileTime
call :getElapsedTime "%fileTime%" "%time%" fileAge fileAgeFormatted
echo %fileAge% %fileAgeFormatted%
endlocal
exit /b
:getFileTime file returnVariable
for /f "tokens=*" %%a in ('forfiles /p "%~dp1." /m "%~nx1" /c "cmd /c echo @ftime"') do set "%~2=%%~a"
exit /b
:getElapsedTime time1 time2 returnVariableCent returnVariableTimeFormat
setlocal enableextensions
call :time2timestamp "%~1" t1
call :time2timestamp "%~2" t2
if %t2% gtr %t1% ( set /a "t=t2-t1" ) else ( set /a "t=8640000-t1+t2" )
if not "%~4"=="" set /a "h=100+ (t/360000)", "m=100+ (t-(h-100)*360000)/6000", "s=100+ (t-(h-100)*360000-(m-100)*6000)/100", "c=100+ (t %% 100)"
endlocal & (if not "%~3"=="" set "%~3=%t%") & (if not "%~4"=="" set "%~4=%h:~-2%:%m:~-2%:%s:~-2%,%c:~-2%") & exit /b 0
:time2timestamp timeValue returnVariable
setlocal enableextensions
if "%~1"=="" ( set "ts=%time%" ) else ( set "ts=%~1" )
if "%ts:pm=%"=="%ts%" ( set "adjust=0" ) else ( set "adjust=12" )
for /f "tokens=1-4 delims=:-.,apm " %%a in ("%ts%") do ( set "h=00%%a" & set "m=00%%b" & set "s=00%%c" & set "c=00%%d")
set /a "ts=(1%h:~-2%-100+adjust)*360000+(1%m:~-2%-100)*6000+(1%s:~-2%-100)*100+(1%c:~-2%-100)"
endlocal & set "%~2=%ts%" & exit /b 0
对于播放声音部分,据我所知,没有办法在不产生另一个进程的情况下直接从命令行播放自定义 wav。常用的工具是 vlc、wmplayer、实例化 wmplayer ocx、录音机、powershell 的 vbs 文件……所有这些选项都记录在前面的问题中(只是第一个问题)here in *** 或here in superuser。
扩展其中一个选项,如果您可以访问某些 C 编译器(使用 mingw 测试),此代码将生成一个控制台工具,该工具调用 PlaySound
API 函数,将第一个参数作为要播放的文件传递。
#include <windows.h>
int main(int argc, char **argv)
if (argc < 2) return 1;
if (!PlaySound(
argv[1],
NULL,
SND_FILENAME | SND_NODEFAULT | SND_SYNC
)
) return 2;
return 0;
根据您的配置,您需要在链接器中包含对 Winmm 库的引用。
【讨论】:
【参考方案2】:在 20 秒后检查它的最佳方法是使用命令 timeout
。超时的语法是:
timeout [TIME]
我建议像这样使用它:
timeout 20 >nul
【讨论】:
以上是关于检查 Windows 批处理文件中是不是经过了 20 秒的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Windows 批处理文件检查端口 8086 是不是正在侦听
检查 Windows 服务列表是不是正在运行,如果不是从批处理文件启动
Windows 7批处理文件:如何检查参数是不是已传递给批处理文件