批处理程序以安全模式启动Windows音频

时间:2014-01-15 18:19:21

标签: batch-file windows-7 command-prompt safe-mode

这是代码:

@echo off

cls
echo.
echo Hello, %username%.
echo This program will enable the sound service.
echo.

:case_1
call:print "Attempting to start Windows Audio..."
call:check_audio "sc start AudioSrv" "case_2"

:case_2
call:print "Attempting to start Windows Audio again..."
call:check_audio "C:\Windows\System32\svchost.exe -k LocalServiceNetworkRestricted" "case_3"

:case_3
echo.
echo Attempting to start dependencies...
echo.
call:print "Starting Multimedia Class Scheduler..."
call:check_active "MMCSS" "sc start MMCSS" "case_4" "Multimedia Class Scheduler"
call:print "Starting Remote Procedure Call (RPC)..."
call:check_active "RpcSs" "sc start RpcSs" "case_4" "Remote Procedure Call (RPC)"
call:print "Starting Windows Audio Endpoint Builder..."
call:check_active "AudioEndpointBuilder" "sc start AudioEndpointBuilder" "case_4" "Windows Audio Endpoint Builder"

call:print "Attempting to start Windows Audio again..."
call:check_audio "sc start AudioSrv" "case_4"

:case_4
echo.
echo Attempting to start dependencies again...
echo.
call:print "Starting Multimedia Class Scheduler..."
call:check_active "MMCSS" "C:\Windows\system32\svchost.exe -k netsvcs" "error" "Multimedia Class Scheduler"
call:print "Starting Remote Procedure Call (RPC)..."
call:check_active "RpcSs" "C:\Windows\system32\svchost.exe -k rpcss" "error" "Remote Procedure Call (RPC)"
call:print "Starting Windows Audio Endpoint Builder..."
call:check_active "AudioEndpointBuilder" "C:\Windows\System32\svchost.exe -k LocalSystemNetworkRestricted" "error" "Windows Audio Endpoint Builder"

call:print "Attempting to start Windows Audio again..."
call:check_audio "C:\Windows\System32\svchost.exe -k LocalServiceNetworkRestricted" "error"

:print
echo %1
echo.

:check_audio
:: Checking if Windows Audio is active. If it is unable to be activated, GOTO <label>.
:: If it has already been activated, GOTO exit.
for /f "tokens=3 delims=: " %%H in ('sc query "AudioSrv" ^| findstr "        STATE"') do (
    :: Tokenises line containing service's state, pulls out third token.
    :: Tests resulting state against the string, "RUNNING".
    if /i "%%H" NEQ "RUNNING" (
        %1 || goto %2
    ) else (
        goto exit
    )
)

:check_active
:: Checking if service is active. If it is unable to be activated, GOTO <label>.
:: If it has already been activated, state that it is already running.
for /f "tokens=3 delims=: " %%H in ('sc query "%1" ^| findstr "        STATE"') do (
    if /i "%%H" NEQ "RUNNING" (
        %2 || goto %3
    ) else (
        echo %4 is already running.
    )
)

:error
:: States what error the program failed with and exits.
echo Program failed with error #%errorlevel%.
exit /b %errorlevel%

:exit
call:print "The program was successful. Windows Audio is running."
pause
exit

有点意大利面,但做的工作......排序。 当我在正常模式下运行它时,它只是进入一个无限循环,不断调用标签“:exit”直到我CTRL-C出来。这是为什么?

1 个答案:

答案 0 :(得分:0)

您的呼叫正在通过,呼叫在呼叫链中上下移动。

这是一个非常简单的示例,将演示该问题(您需要使用 Ctrl + C 来突破无限循环(可能需要多次尝试!) - 检查输出屏幕上看看发生了什么):

@echo off
:callit
call:print "Callit"

:print                              :: Start execution
echo %1
echo.                               :: Fall through to :error

:error                              
echo "In Error"                     :: Continue execution (fall through)

:exit
call:print "Loop from exit"         :: Loop back upward to :print and start again
pause
exit

你会看到类似的输出(小的摘录,开始和结束的运行 - 为了简洁起见,在中间剪切了大量的重复):

"Callit"

"In Error"
"Loop from exit"

"In Error"
"Loop from exit"

"In Error"
"Loop from exit"

"In Error"
"Loop from exit"

"In Error"
"Loop from exit"

"In Error"
"Loop from exit"

"In Error"
"Loop from exit"

"In Error"
^CTerminate batch job (Y/N)?