2013-04-10 1 views
0

Je fais une alarme par lots, mais j'ai besoin d'un moyen d'activer le son automatiquement, donc je n'ai pas à le faire.comment puis-je changer le volume de mon ordinateur en utilisant un fichier batch?

code actuel pour l'alarme (si vous avez d'autres améliorations, n'hésitez pas à les suggérer).

@ECHO OFF 
color 0a 
cls 
echo Ezlo alarm system 
echo The curent time is: %time% 
set /p INPUT=What time should the alarm be set for? (24hr) 
:time 
cls 
echo Ezy alarm 
echo The curent time is: %time% 
Echo Alarm is set for %input% 
if '%TIME%'=='%INPUT%' GOTO ALARM 
GOTO time 
:ALARM 
ECHO get up! 
start "D:\Users\nic\Desktop\ezlo alarm\alarmtone.mp3" 
echo press space to close 
PAUSE >nul 
+0

Pourquoi cette question est-elle marquée [c] et [nul]? – alk

+0

Bienvenue à S.O. Si c'est la première fois que vous êtes ici, jetez un coup d'œil sur [cette information] (http://meta.stackexchange.com/a/5235/187716) pour marquer une réponse comme acceptée. – rojo

Répondre

1

Bien sûr, c'est brut, mais cela fonctionne. Le code clé 0xAF est un virtual key pour augmenter le volume. Voici un peu de JScript pour envoyer ce code de clé 50 fois.

var shl = new ActiveXObject("WScript.Shell"); 
for (var i=0; i<50; i++) { 
    shl.SendKeys(String.fromCharCode(0xAF)); 
} 

Vous pouvez intégrer dans votre script batch en utilisant un format hybride lot + JScript. J'ai fait quelques autres modifications à votre script, en ayant le temps passé backpass et reoutput au lieu d'effacer l'écran sur chaque boucle, ce qui rend la comparaison de temps une comparaison mathématique pour permettre l'entrée de hh:mm sans avoir à spécifier des secondes et centisecondes, et sinon juste un peu de polissage ici et là.

@if (@[email protected]) @end /* 

:: batch portion 

@ECHO OFF 
setlocal 
cls && color 0a 
:: capture backspace character to %BS% 
for /f %%a in ('"prompt $H&for %%b in (1) do rem"') do set "BS=%%a" 
echo Ezlo alarm system 
call :gettime now 
echo The curent time is: %now% 
set /p INPUT=What time should the alarm be set for? (24hr) 
echo; 

if "%now%" geq "%input%" (set tomorrow=1) else set tomorrow= 

if defined tomorrow (
    echo Alarm is set for %input% tomorrow. 
) else echo Alarm is set for %input%. 

set /p "=The curent time is: "<NUL 
:time 
call :gettime now 
set /p "=%now%"<NUL 
if "%now%" geq "%INPUT%" (
    if not defined tomorrow GOTO ALARM 
) else if defined tomorrow set tomorrow= 
ping -n 2 0.0.0.0 >NUL 
call :len %now% len 
for /l %%I in (1,1,%len%) do set /p "=%BS%"<NUL 
GOTO time 

:ALARM 
echo; 
ECHO get up! 
cscript /nologo /e:jscript "%~f0" 
start "" "D:\Users\nic\Desktop\ezlo alarm\alarmtone.mp3" 
echo press space to close 
PAUSE >nul 
color 07 
exit /b 

:gettime <varname> 
set "gtvarnow=%time:~0,-3%" 
set "%~1=%gtvarnow: =%" 
goto :EOF 

:len <string> <varname> 
set len=0 
set str=%~1 
:len_loop 
if defined str (
    set "str=%str:~1%" 
    set /a "len+=1" 
    goto :len_loop 
) else set "%~2=%len%" 
goto :EOF 


:: JScript portion */ 

var shl = new ActiveXObject("WScript.Shell"); 
for (var i=0; i<50; i++) { 
    shl.SendKeys(String.fromCharCode(0xAF)); 
} 

Malheureusement, il n'y a pas moyen facile programme pour détecter si le volume du système est coupé. Bien sûr, il y a un code clé pour basculer muting, mais pas de manière programmatique facile de vérifier s'il doit être déclenché ou non. Si vous avez besoin de votre script pour forcer le système à ne pas être coupé, la solution la plus simple consiste à utiliser un utilitaire tiers tel que NirCmd. Voir this answer pour plus de détails.

Questions connexes