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