检查 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批处理文件:如何检查参数是不是已传递给批处理文件

如何检查给定的字符串是不是是 Windows 下的合法/有效文件名?

如何通过批处理文件命令检查 xml 元素/属性是不是存在

如何检查批处理文件中是不是存在文件[重复]