检查Windows批处理文件中是否已经过了20秒

时间:2014-04-21 04:33:30

标签: batch-file

每当我收到符合条件的电子邮件时,我都会运行一个批处理文件,该文件会获取一部分信息并将其与一个文件进行比较,然后将该信息写入两个文件并播放声音。

我想要做的是,如果自上次文件更新(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中有没有一种方法可以在不启动我正在进行的应用程序的情况下播放声音?

提前致谢

2 个答案:

答案 0 :(得分: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的vbs文件,录音机,powershell,...所有这些选项都记录在以前的问题中(只是第一个)在stackoverflow中herehere在超级用户中。

扩展其中一个替代方案,如果您可以访问某些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库的引用。

答案 1 :(得分:0)

检查它20秒的最佳方法是使用命令timeout。超时的语法是:

timeout [TIME]

我建议像这样使用它:

timeout 20 >nul