Re: [問題] bat 問題請教

作者: LPH66 (-6.2598534e+18f)   2016-01-08 01:03:40
※ 引述《blackspace98 (~我愛夏天~)》之銘言:
: if %ERRORLEVEL% == 0 (
: echo "%process_name%" Program is Running !!!
: ) else (
: echo "%process_name%" Program is Not Running !!!
: set /p index=input[Y,N]:
: echo %index%
: if "%index%" == 'Y' (
: start D:\software\FSCapture.exe
: )
: )
: pause
: 如果把黃色的部分拿掉只剩下 start D:\software\FSCapture.exe
: 就很順利的達成我要的結果
: 但是如果加上黃色的部分,當我執行的時候就會出現如下的訊息
: input[Y,N]:Y
: ECHO 已關閉。
: 請按任意鍵繼續 . . .
: 請問各位,這應該怎麼解決呢? 謝謝您
這裡有兩個問題
其一, Windows 的變數展開是在讀取指令時取代
注意這並不是細部的一條指令, 而是最外層的一條指令
在此就是我上面留下來的 if ... (...) else (...) 這一大塊
在讀取這條指令的當下 %index% 還沒有值
所以那行 "echo %index%" 就只會展開成 "echo "
而沒有參數的 echo 是用來顯示目前的 echo 設定情形的
(就是執行指令時要不要先印指令出來)
因為這時是 echo off 狀態所以顯示了「ECHO 已關閉。」
這個要解決得要使用所謂的「延遲環境變數展開」功能
用法是原本用 %...% 展開的變數改成 !...!
這樣就能夠讓變數展開留到底層指令執行時才展開
其二, 你的 if 字串比對用法錯了
事實上 Windows batch 的 if 只要裡面有帶 == 就一定是字串比對
不需要也不認得雙引號
這個雙引號的使用跟 if 無關, 而是跟命令列參數的切割有關
但因為 if 是內部指令, 他會直接去看這個切割出來的參數字串而不刪除雙引號
因此當比較字串兩端的引號狀況有所不同時就一定不會成立
例如 if "a" == a (echo True) else (echo False) ←這個印出 False
if "a" == 'a' (echo True) else (echo False) ←這個也印出 False
if "'a'" == 'a' (echo True) else (echo False) ←這個也印出 False
if "a" == "a" (echo True) else (echo False) ←這個印出 True
if a == a (echo True) else (echo False) ←這個也印出 True
if 'a' == 'a' (echo True) else (echo False) ←這個也印出 True
所以, 這裡你要改成 if "!index!" == "Y" ( ...
這樣才會正確比較 (注意這裡也是延遲展開, 理由很容易明白)
另外應該有不少人有聽說這種比較就都加雙引號, 這是為了安全起見
因為變數裡有空白或根本變數就是空值時會對命令解析造成影響
要讓 == 兩邊都能有恰好一個東西的話用 "" 抓起來讓它切割成一整個參數再去比最簡單

Links booklink

Contact Us: admin [ a t ] ucptt.com