2014-01-15 151 views
0

啓動Windows音頻這是代碼:批處理程序以安全模式

@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

你考慮重新命名標籤到'exit'以外的東西,比如'quit'或''完成「,看看是否可以解決問題? (或者完全刪除最後的'exit'?)將一個有意義的批處理術語用作標籤有點愚蠢? –

+0

@KenWhite它仍在產生一個無限循環: 你好,邁克爾。 該程序將啓用聲音服務。 「試圖啓動Windows音頻...」 系統找不到指定的驅動器。 「程序成功,Windows Audio正在運行。」 系統找不到指定的驅動器。 「程序成功,Windows Audio正在運行。」 系統找不到指定的驅動器。 「程序成功,Windows Audio正在運行。」 系統找不到指定的驅動器。 「程序成功,Windows Audio正在運行。」 – user3155247

+0

刪除check_audio for循環中的註釋消除了「系統找不到」消息,但仍然是一個無限循環。 – user3155247

回答

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)?