2015年9月20日 星期日

windows cmd 指令讀取輸入的字串

以下在 windows 寫一個 bat 批次檔,操作 nginx 的管理指令(start nginx、nginx -s stop、nginx -s quit、nginx -s reload、nginx -s reopen),使用者輸入1~5,執行對應的指令。

流程:
  • 使用 set /P 讀取輸入的字串,再使用 if 判斷要執行的指令
  • 為避免重覆啟動 nginx,若選擇 start nginx,先用 tasklist 列出目前系統執行的程序,傳給 find 過濾要找的程序名稱,再使用 %ERRORLEVEL% 判斷 nginx.exe 是否已在執行中
範例:
@echo off
:mm
echo ##########################################################
echo 1:start nginx
echo 2:nginx -s stop (fast shutdown)
echo 3:nginx -s quit (graceful shutdown)
echo 4:nginx -s reload 
echo   (changing configuration,
echo    starting new worker processes with a new configuration,
echo    graceful shutdown of old worker processes)
echo 5:nginx -s reopen (re-opening log files)
set act=0
set /P act=選擇要執行的指令[1/2/3/4/5]:


if %act%==1 (
goto m1
)
if %act%==2 (
goto m2
)
if %act%==3 (
goto m3
)
if %act%==4 (
goto m4
)
if %act%==5 (
goto m5
)
cls
echo 請輸入1~5任一數字
goto mm


:m1
cls
echo %act%
REM 判斷nginx.exe是否已經在執行
tasklist /NH | find /I "nginx.exe"
if %ERRORLEVEL% == 1 (
start nginx
echo start nginx
echo ...
) else (
echo 程式已在執行中,請先停止
)
goto mm

:m2
cls
echo %act%
nginx -s stop
echo nginx -s stop
echo ...
goto mm

:m3
cls
echo %act%
nginx -s quit
echo nginx -s quit
echo ...
goto mm

:m4
cls
echo %act%
nginx -s reload
echo nginx -s reload
goto mm

:m5
cls
echo %act%
nginx -s reopen
echo nginx -s reopen
echo ...
goto mm


參考:
How to read input from console in a batch file?
DOS中判断进程是否存在的方法

5 則留言:

  1. XYZ版主大大,我想請教一件事情
    使用 "set /p var1=XXXXXXX"指令
    會對電腦造成什麼影響嗎@@ 比如說修改到電腦本身的環境變數
    有勞您了

    回覆刪除
    回覆
    1. "set /p var1=XXXXXXX"
      將使用者輸入的值,指派給var1
      如果var1是環境變數,我試的結果是也會改變。
      如果您擔心的是之後整個系統var1環境變數都變了。
      可以另開一個視窗輸出var1環境變數測試看看。
      我試的結果是只在原本的cmd視窗有影響。
      可以 set /? 查看指令的用法,或許對測試有幫助。

      刪除
    2. 剛找到微軟官網的說明。
      https://msdn.microsoft.com/zh-tw/library/cc737438%28v=ws.10%29.aspx
      「在命令殼層中,Cmd.exe 的每個例項,會繼承其上層應用程式的環境。因此,您可以在新的 Cmd.exe 環境中變更變數,而不會影響到該上層應用程式的環境。」
      「使用 set 命令以建立、變更、刪除或顯示環境變數。set 命令僅變更目前殼層環境中的變數。」

      刪除
    3. 謝謝XYZ大大@@,打擾您了。
      下次我會先查查MS官網說明...
      都沒想到有這東西,謝謝XYZ版主。

      刪除
    4. 其實也是因為您有問,我才發現官網有說明 :)

      刪除