0

这是代码:

@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 退出它。为什么是这样?

4

1 回答 1

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)?
于 2014-01-17T16:33:34.640 回答