我有一个具有挑战性的问题。
我对批处理脚本的要求,
以下是我写的脚本,
@echo off
: loop
tasklist /fi "imagename eq Firefox.exe" |find ":" > nul
if errorlevel 1 (start "C:\Program Files\KMPlayer 64X\KMPlayer64" "C:\Users\UserName\Desktop\Apple.mp3") else (goto loop)
// no exit
该脚本仅第一次运行,不会循环。有人可以帮忙吗?
这是一种可能的解决方案:
@echo off
title Firefox Watcher
setlocal EnableExtensions DisableDelayedExpansion
set "MusicPlay="
:Loop
%SystemRoot%\System32\tasklist.exe /FI "IMAGENAME eq Firefox.exe" /NH 2>nul | %SystemRoot%\System32\find.exe /I "firefox.exe" || goto NoFirefox
if defined MusicPlay goto WaitTime
start "" "%ProgramFiles%\KMPlayer 64X\KMPlayer64.exe" "%UserProfile%\Desktop\Apple.mp3"
if not errorlevel 1 set "MusicPlay=1"
goto WaitTime
:NoFirefox
if not defined MusicPlay goto WaitTime
%SystemRoot%\System32\taskill.exe /IM KMPlayer64.exe >nul 2>nul
set "MusicPlay="
:WaitTime
cls
%SystemRoot%\System32\choice.exe /C NY /N /T 5 /D N /M "Stop watching Firefox [N/y]?"
if not errorlevel 2 goto Loop
if defined MusicPlay %SystemRoot%\System32\taskill.exe /IM KMPlayer64.exe >nul 2>nul
endlocal
可以用于标签
WaitTime
下面的命令块也只是:
%SystemRoot%\System32\timeout.exe /T 5 /NOBREAK >nul
goto Loop
这会导致 5 秒超时,且不会提示用户停止观看 Firefox,而在再次运行 Firefox 时仅等待最多 5 秒的用户输入检查。
需要使用 CHOICE 或 TIMEOUT(或 PING)等待一段时间才能暂停批处理脚本执行一段时间(例如五秒),否则 Windows 命令处理器
cmd.exe
将再次执行批处理文件中的命令,并且再次尽可能快,这意味着 cmd
将 100% 使用 CPU 的一个核心,并且会进行大量文件系统访问,因为一次又一次地启动可执行文件 TASKLIST,而在执行之间没有任何暂停。这对于运行音乐播放器的整个计算机性能不利,并且 Firefox 还需要 CPU 性能和对文件系统的访问。
最好将启动 Firefox 的快捷方式替换为通过命令行启动
cmd.exe
的快捷方式,将音乐播放器作为单独的进程启动,运行 Firefox 并等待其自行终止,然后终止音乐播放器。这样效率会更高。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
cls /?
choice /?
echo /?
endlocal /?
find /?
goto /?
if /?
set /?
setlocal /?
start /?
taskkill /?
tasklist /?
timeout /?
title /?
另请参阅:
>nul
、2>nul
和 |
的说明。||
。