2012-09-13 62 views
0

我已經詢問了有關DOS中的Concatenated命令的其他問題,但顯然還不完全相信需要考慮的事情的完整情況。DOS在concatendated命令字符串中的延遲擴展

有人可以看看下面的代碼和輸出我的系統上,看看他們是否能指教一下語法錯誤(注,我已經手動打破行):

%comspec% /v:on /k "(for /f "tokens=2*" %a in ('reg query hkcu\software\microsoft 
\windows\currentversion\policies\system /v DisableTaskMgr') do @set DisableTaskMg 
r=%b) 2>nul & set DisableTaskMgr& pause & (if defined programfiles^(x86^) (set 
"ProgramFiles(x32)=%programfiles(x86)%") else (set "ProgramFiles(x32)=%programfil 
es%")) & !ProgramFiles(x32)!\Mozilla\Firefox\Firefox.exe -chrome chrome://browser 
/content & echo. & if defined DisableTaskMgr (echo DisableTaskMgr reg key existed 
prior to running, and... & (set DisableTaskMgr=%DisableTaskMgr:~2,3% & echo ! 
DisableTaskMgr! & reg add hkcu\software\microsoft\windows\currentversion\policies 
\system /v DisableTaskMgr /t REG_DWORD /d %DisableTaskMgr% & if %DisableTaskMgr% 
eql 0 (echo Previous state was Task Manager enabled) else (echo Previous state 
was Task Manager DISabled))) else (echo DisableTaskMgr reg key DID NOT exist pri 
or to running & reg delete hkcu\software\microsoft\windows\currentversion\polici 
es\system /v DisableTaskMgr /f)" 


enter image description here

我試圖切割出的部分代碼,以解決個別的部分,但我在努力嘗試和錯誤證明我沒有太多的什麼是錯的想法,那我不打算得到這個解決我自己的速度非常快:(

enter image description here

回答

1

你如果比較操作是錯誤的你有eql - 它應該是equ

我不知道如果這是你唯一的問題。 - 你哈有一個可怕的維護問題與一個聲明的野獸。

您可能會更好地使用相同的邏輯創建批處理文件,但格式很好。然後您可以簡單地調用批處理文件,而不是試圖將整個複雜流程作爲一個複雜命令嵌入。

+0

啊,謝謝!我相信還有其他的錯誤,我希望有人能看到。是的,知道它很難維護,但客戶最終創建了一個用我創建的批處理文件的快捷方式,所以我試圖繞過這個想法。另外,我喜歡挑戰! :) – user66001

0

我可以在這裏看到你的問題!這是你的代碼! * 笑容 *

雖然嚴重,即使你打算保留那些亂七八糟,我建議把它分解成它是用於調試目的的組成部分。您甚至可以通過將()塊中的內容放入單獨的子例程來避免有時出現的神祕塊錯誤。通過轉動這樣的事情......

if statement (
    code block 1 
    code block 1 
    code block 1 
    code block 1 
) else if (
    code block 2 
    code block 2 
    code block 2 
    code block 2 
) 

...到這樣的事情:

if statement (
    call :CodeBlock1 
) else if (
    call :CodeBlock2 
) 
goto :eof 

:CodeBlock1 
    code 
    code 
    code 
    code 
goto :eof 

:CodeBlock2 
    code 
    code 
    code 
    code 
goto :eof 

試圖調試爲單行意味着保持了整個事情,以及它是如何交互,時刻牢記在心。而且基本上不得不猜測哪些類似的代碼實際上會創建你正在嘗試修復的錯誤。

我個人浪費了很多時間試圖修復完美的代碼,但沒有意識到我正在查看的錯誤實際上是在代碼塊中進一步下降。

找到並解決了錯誤後,如果您願意,可以將它全部重新組合成一行。克服挑戰並不一定意味着以最難的方式做到這一點。根據定義,克服挑戰最簡單的方法也是克服挑戰。

+0

感謝您的回答@JamesK - 這是一個很好的調試建議,但已經做了類似的事情,並得出結論,這是我對延遲擴展的知識持續缺乏,這是代碼不產生期望的輸出。 – user66001

+0

@ user66001 - 好的,請記住,使用延遲擴展不需要限制使用內部代碼塊。任何時候'setlocal enabledelayesexpansion'都可以正常工作,有時候會更好。^_ ^ –