2015-12-16 56 views
0

我一直在閱讀如何avoid spaghetti code in batch files避免麪條代碼

在意大利麪條代碼是什麼的例子中,我意識到,當我登錄,我使用批處理文件幾乎適合這個例子。有人能幫我讓我的批處理文件沒有意大利麪代碼嗎?

@ECHO OFF 
CLS 


:MENU 
echo Welcome %USERNAME% 

echo 1 - Start KeePass 
echo 2 - Backup 
echo 3 - FireFox 
echo 4 - Exit 

SET /P M=Please Enter Selection, then Press Enter: 

IF %M%==1 GOTO StarKeePass 
IF %M%==2 GOTO Backup 
IF %M%==3 GOTO FireFox 
IF %M%==4 GOTO :EOF 
GOTO MENU 


:StarKeePass 
SET keePass="%USERPROFILE%\KeePass\KeePass-2.30\KeePass.exe" 
SET kdb="%USERPROFILE%\KeePass\PasswordDatabase\PasswordDatabase.kdbx" 

echo I'll start KeePass for You 
START "" %keePass% %kdb% 

GOTO MENU 

:Backup 
SET backup="%USERPROFILE%\backup.bat" 
call %backup% 

GOTO MENU 

:FireFox 
cd "C:\Program Files (x86)\Mozilla Firefox\" 
start firefox.exe 

GOTO MENU 
+2

這是明確不麪條代碼。例如,當函數調用的語法嵌套過深或其他構造時,它被稱爲SC,這些構造應邏輯分組並分成多行。 – Ctx

+0

@Ctx - 感謝您的澄清。那麼,從外觀看,這很好,對嗎?我還有一篇關於如何使它更健壯的帖子,但這是一個不同的問題。 –

+1

對我來說看起來很好,是的 – Ctx

回答

2

在這種情況下,如果你想使用子程序,你應該這樣做:

@ECHO OFF 
CLS 


:MENU 
echo Welcome %USERNAME% 

echo 1 - Start KeePass 
echo 2 - Backup 
echo 3 - FireFox 
echo 4 - Exit 

SET /P M=Please Enter Selection, then Press Enter: 

IF %M%==1 CALL :StartKeePass 
IF %M%==2 CALL :Backup 
IF %M%==3 CALL :FireFox 
IF %M%==4 GOTO :EOF 
GOTO MENU 


:StartKeePass 
SET "keePass=%USERPROFILE%\KeePass\KeePass-2.30\KeePass.exe" 
SET "kdb=%USERPROFILE%\KeePass\PasswordDatabase\PasswordDatabase.kdbx" 

echo I'll start KeePass for You 
START "" %keePass% %kdb% 

GOTO :EOF 

:Backup 
SET "backup=%USERPROFILE%\backup.bat" 
call %backup% 

GOTO :EOF 

:FireFox 
cd "C:\Program Files (x86)\Mozilla Firefox\" 
start firefox.exe 

GOTO :EOF 

注意,我改變了一些東西。代替goto ... goto菜單,您應該使用call :labelgoto :eof/exit /b。除此之外,你有拼寫錯誤星牛逼 KeePass的,而不是set variable="value",最好使用set "variable=value"。這也將接受空間的價值,但它不會引號添加到您的變量

下一次,你應該張貼這code review,因爲這些東西是不是真的錯誤

+0

快問題,爲什麼說goto:eof比goto:菜單更好? –

+0

來解釋它,從給定的標籤開始暫時給這個內部創建一個新的批處理文件。當該批處理文件完成時,它將返回到呼叫線路下的呼叫線路。 –

+0

goto:eof並不是更好,但是它是使用子例程的選擇,或者只是不斷轉移到批處理文件中。我建議尋找[這裏](http://ss64.com/nt/call.html)以獲得更好的解釋 –

0

如果你想刪除goto完全可以,您可以簡單地再次調用腳本以繼續使用它。另外,如果您使用的是Windows以後版本的Windows,請查看choice命令,因爲它不需要檢查用戶是否輸入了無效輸入。

@echo off 

cls 
echo Welcome %USERNAME% 

echo 1 - Start KeePass 
echo 2 - Backup 
echo 3 - FireFox 
echo 4 - Exit 

choice /C:1234 /M "Please enter your selection: " /N 

:: The first option listed by choice's /C option will return an errorlevel value of 1, the second 2, and so on 
if %errorlevel% equ 1 (
    SET keePass="%USERPROFILE%\KeePass\KeePass-2.30\KeePass.exe" 
    SET kdb="%USERPROFILE%\KeePass\PasswordDatabase\PasswordDatabase.kdbx" 

    echo I'll start KeePass for You 
    START "" %keePass% %kdb% 
) 

:: I've converted these to one-liners simply for personal preference. 
:: You can keep these the way you had them if you put them inside of parentheses like with option 1. 
if %errorlevel% equ 2 call "%USERPROFILE%\backup.bat" 
if %errorlevel% equ 3 start "" "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" 
if %errorlevel% equ 4 exit /b 

:: Calls this script again, simulating a goto :MENU 
:: Personally, I'd stick with a label and a goto in this instance, 
:: but this is how you could do it if you don't want to use goto at all 
call %0 

如果每一個選擇,用戶可以非常簡單(即它可以被簡化爲一個或兩個命令),你可能想這樣的代碼;否則,絕對使用像丹尼斯建議的子程序。

0

我關於組織這取,加了復位到m變量,允許一些偶然輸入被處理,並使其在所有的代碼一個塊檢查。

沒有錯,「丹尼斯麪包車GILS」的答案,想我會告訴你一個不同的方法。

@echo off 
setlocal enableDelayedExpansion 

:menu 
set "m=" 
cls 
echo/Welcome !username! 
echo/ 
echo/1 - Start keepass 
echo/2 - Backup 
echo/3 - Firefox 
echo/4 - Exit 
echo/ 
set /p "m=Please enter selection, then press enter:" 
if not defined m (
    cls 
    echo/Error: Empty input. 
    pause 
) else (
    if "!m!" equ "1" (
     set "keepass=!userprofile!\keepass\keepass-2.30\keepass.exe" 
     set "kdb=!userprofile!\keepass\passworddatabase\passworddatabase.kdbx" 
     echo/I'll start keepass for you 
     start "" !keepass! !kdb! 
    ) else (
     if "!m!" equ "2" (
      set "backup=!userprofile!\backup.bat" 
      call !backup! 
     ) else (
      if "!m!" equ "3" (
       cd "c:\program files (x86)\mozilla firefox\" 
       start firefox.exe 
      ) else (
       if "!m!" equ "4" (
        goto :eof 
       ) else (
        cls 
        echo/Error: ["!m!"] not recognized. 
        pause 
       ) 
      ) 
     ) 
    ) 
) 
goto :menu 

注:echo/作爲一種習慣,如echo:echo\我誤認爲是文件路徑/ URL的一部分,並echo.如此煞費苦心其較長的命令時指出。

此外,我更喜歡使用!而不是%以及setlocal enableDelayedExpansion純粹的偏好和易於塊編碼。