為什麼這篇echo指令用法鄉民發文收入到精華區:因為在echo指令用法這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者LPH66 (-6.2598534e+18f)看板Programming標題Re: [問題] b...
※ 引述《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" ( ...
這樣才會正確比較 (注意這裡也是延遲展開, 理由很容易明白)
另外應該有不少人有聽說這種比較就都加雙引號, 這是為了安全起見
因為變數裡有空白或根本變數就是空值時會對命令解析造成影響
要讓 == 兩邊都能有恰好一個東西的話用 "" 抓起來讓它切割成一整個參數再去比最簡單
--
1985/01/12 三嶋鳴海 1989/02/22 優希堂悟 1990/02/22 冬川こころ 1993/07/05 小町
つぐみ 歡迎來到 1994/05/21 高江ミュウ 1997/03/24 守野いづみ 1997/03/24 伊野瀬
チサト 1998/06/18 守野くるみ 打越鋼太郎的 1999/10/19 楠田ゆに 2000/02/15 樋口遙
2002/12/17 八神ココ 2011/01/11 HAL18於朱倉岳墜機 ∞與∫的世界 2011/04/02 茜崎空
啟動 2012/05/21 第貮日蝕計畫預定 2017/05/01~07 LeMU崩壞 2019/04/01~07 某大學合宿
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.39.85
※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1452186223.A.B89.html