iT邦幫忙

1

BAT內,如何加IF判斷式,ECHO的文字變顏色

其實,小弟的發想是...
寫一個BAT,讓User判斷網路不通時,該檢查什麼?

所以,我BAT檢查的順序:
第一關會是,有沒有Gateway
第二關會是,ping不ping的到Gateway
第三關會是,ping不ping的到外網。

■問題1、 IF ELSE...我有試著要加入BAT內...
不過,echo的訊息會有問題...
...我現在下面的《測試項目二》即使ping不到Gateway,還是會ECHO出正常的訊息!

■問題2、當ECHO 錯誤訊息時,希望能夠變字!

※整個BAT最後想要調整到....
1、當第一關,發現沒有Gateway時,提示完後,不做第二關及第三關的測試
2、當第二關,發現ping不到Gateway時,不做第三關的測試。
3、當有錯誤時,ECHO的字,希望能夠變色。

再勞煩各位大大指教一下!

↓目前BAT的內容,如下:

@if "%1" == "max" goto top
@start "" /max "%~nx0" max
@exit
:top
@Set title=Network Eevironment Ping Tester
@(color 1F) & (@Title %title%)
@echo:
::# Define a temp variable 'DefaultGateway'
@For /f "tokens=3" %%* in (
   'route.exe print ^|findstr "\<0.0.0.0\>"'
   ) Do @Set "DefaultGateway=%%*"

::# Redirect output to a textfile

@echo 《%title%》
@echo 測試時間:%Date% %time%
@echo:
@echo 《測試項目一》此電腦,是否有連接到區網?
@IF "%DefaultGateway%"=="" (
@Echo ▲  測 試 結 果 → 請 檢 查 網 路 線 !
@echo:
) else (
@Echo ㊣  測 試 結 果 → 《區 域 網 路》 正 常 ! ㊣
@echo -----------------------------------
@echo 《測試項目二》測試閘道器是否正常?
@ping %DefaultGateway% -n 3
@echo:
@IF %errorlevel%==0 echo  ※ 《測試項目一》→《IP分享器》IP位置:%DefaultGateway% 
@IF %errorlevel%==0 echo  ㊣  測 試 結 果 → 《IP分享器》 正 常 ! ㊣
@IF %errorlevel%==1 echo  ※ 《測試項目一》→《 IP分享器》IP位置: %DefaultGateway%
@IF %errorlevel%==1 echo  ▲  測 試 結 果 → 請 重 開 ! 《I P 分 享 器 》!
)
@echo -----------------------------------
@ping 127.0.0.1 -n 2 -w 1000 > nul
@echo:
@echo 《測試項目三》測試對外網路是否正常?
@ping 168.95.1.1 -n 3 
@echo:
@IF %errorlevel%==0 echo  ※ 《測試項目二》→《對外網路》測試位置:168.95.1.1
@IF %errorlevel%==0 echo  ㊣  測 試 結 果 → 《 中 華 電 信 小 烏 龜 》 正 常 ! ㊣
@IF %errorlevel%==1 echo  ※ 《測試項目二》→《對外網路》測試位置:168.95.1.1
@IF %errorlevel%==1 echo  ▲  測 試 結 果 → 請 重 開 ! 《 中 華 電 信 小 烏 龜 》!
@IF %errorlevel%==1 echo:
@IF %errorlevel%==1 echo  〒  中華電信ADSL障礙申告專線:0800-080-128
@echo -----------------------------------

@ping 127.0.0.1 -n 2 -w 1000 > nul
@echo:
@echo:
@echo ------------------ ※ 測 試 結 束 ! ------------------
@echo:
@pause 
exit
看更多先前的討論...收起先前的討論...
weiclin iT邦高手 4 級 ‧ 2019-01-28 13:03:54 檢舉
變色的部份就像 BBS 那樣弄, 這篇很清楚:
https://stackoverflow.com/a/38617204/4835006
echochio iT邦高手 1 級 ‧ 2019-01-28 13:28:02 檢舉
这之前写过,我再找找给你
感謝weiclin大大回答...

我一篇文章,我也有找過...

不知道是加的方式不對還是怎樣?

我直接在bat內加入
@echo ^<ESC^>[0m [0m測試文字[0m

在Win10 v1809 Pro x64 執行BAT後的

會顯示『ESC[0m [0m測試文字[0m』
....並不會變色!

還是感謝大大。
小成 iT邦高手 10 級 ‧ 2019-01-28 15:36:30 檢舉
加的方式不對
https://i.imgur.com/t4fBoqm.png
下面這一行是這麼加的
https://i.imgur.com/A0Qx3PH.png
按住左邊的ALT,然後輸入數字27,然後放開ALT,然後打 [,然後加上顏色碼,例如亮藍色是96m,然後輸入訊息,然後再一次按住左邊的ALT,然後輸入數字27,然後放開ALT,然後打 [,然後再輸入0m恢復原狀。
小成大大,先感謝您的回覆...

我的操作流程是...開啟一個BAT檔後,
先輸入@echo→空格
→鍵盤『左邊ALT』按住,再按下數字2→再按下數字7....(此時記事本的畫面並無任何異動)....放開『左邊ALT』後,再輸入[96m...
我的畫面上只有《@echo [96m》

,按一個空白→再輸入『測試訊息』→按一個空白→鍵盤『左邊ALT』按住,再按下數字2→再按下數字7→放開『左邊ALT』後,再輸入[[0m,
我的畫面,只有《@echo [96m 測試訊息 [[0m》

執行BAT後,出來的訊息,還是
[96m 測試訊息 [[0m

並沒有變顏色....不曉得,是那邊有問題?跟我是Win10 v1809有關嗎?
小成 iT邦高手 10 級 ‧ 2019-01-29 08:55:15 檢舉
如同蟹老闆說的,記事本無效。但是已經做好的可以在記事本中編輯,不要動到前置字元就好(在記事本中看起來會像個空白)
所以你看我的圖,我是在命令提示字元下做的。
另外可以不用空白
小成大大,感謝您的提醒!受教了!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
蟹老闆
iT邦大師 1 級 ‧ 2019-01-29 03:58:55
最佳解答

請參考
沒有詳細測試,基本測試沒有問題.
說明:
Set AnsiRed 設定為紅字黑底
Set AnsiEnd 結束設定色彩,若設定過色彩後將會返回原黑底色所以需要以將後續設為藍底
前置編碼(字符)ESC(Alt+27)無法以記事本輸入,需以 Notepad++ 編輯器輸入
目前彩色效果僅加在
echo %AnsiRed%㊣ 測 試 結 果 → 《IP分享器》 正 常 ! ㊣%AnsiEnd%
請自行調整其它欲變色的位置,只需在變色字串前加上%AnsiRed% 及結束位置加上%AnsiEnd%即可

Echo Off
if "%1" == "max" goto top
start "" /max "%~nx0" max
exit
:top
Set title=Network Eevironment Ping Tester
Set AnsiRed=
Set AnsiEnd=
(color 1F) & (@Title %title%)
echo 《%title%》
echo 測試時間:%Date% %time%
echo:
::# Define a temp variable 'DefaultGateway'

For /f "tokens=3" %%* in ('route.exe print ^|findstr "\<0.0.0.0\>"') Do (
    echo 《測試項目一》此電腦,是否有連接到區網?
    Echo ㊣  測 試 結 果 → 《區 域 網 路》 正 常 ! ㊣
    echo -----------------------------------
    echo 《測試項目二》測試閘道器是否正常?
    ping -n 3 %%* && (
        echo:
        echo  ※ 《測試項目一》→《IP分享器》IP位置:%%*
        echo  %AnsiRed%㊣  測 試 結 果 → 《IP分享器》 正 常 ! ㊣%AnsiEnd%
    )||(
        echo  ※ 《測試項目一》→《 IP分享器》IP位置: %%*
        echo  ▲  測 試 結 果 → 請 重 開 ! 《I P 分 享 器 》!
	Goto :End
    )
    echo -----------------------------------
    ping 127.0.0.1 -n 2 -w 1000 > nul
    echo:
    echo 《測試項目三》測試對外網路是否正常?
    ping -n 3 168.95.1.1 && (
        echo:
        echo  ※ 《測試項目二》→《對外網路》測試位置:168.95.1.1
        echo  ㊣  測 試 結 果 → 《 中 華 電 信 小 烏 龜 》 正 常 ! ㊣
    )||(    
        echo  ※ 《測試項目二》→《對外網路》測試位置:168.95.1.1
        echo  ▲  測 試 結 果 → 請 重 開 ! 《 中 華 電 信 小 烏 龜 》!
        echo:
        echo  〒  中華電信ADSL障礙申告專線:0800-080-128
    )
echo -----------------------------------
Goto :End
)
Echo ▲  測 試 結 果 → 請 檢 查 網 路 線 !
:End
ping 127.0.0.1 -n 2 -w 1000 > nul
echo ------------------ ※ 測 試 結 束 ! ------------------
pause 
看更多先前的回應...收起先前的回應...
蟹老闆 iT邦大師 1 級 ‧ 2019-01-29 04:13:16 檢舉

補充:用route 來抓預設閘道(findstr "<0.0.0.0>")可能會有預期外的結果,用pathping (內部IP分享器) 或 tracert (公網閘道)或許也是不錯的方式.
圖中第二筆才是我防火牆IP,第一筆為VPN的IP
https://ithelp.ithome.com.tw/upload/images/20190129/200061497fKCiM6sx2.jpg

蟹老闆大大 感謝您抽空回應!

我使用您的code貼到Notepad++後,
編碼選擇『編譯成ANSI碼』另存成BAT後,

執行...還是不會變色!

後來參考ami_jslian大大回應的內容後,
安裝完後,在執行您的BAT,就有正常顯示顏色了!

不過,我後來,還是試著在Notepad++上,

試著輸入《前置編碼(字符)ESC》
我試了按住左邊ALT或右邊ALT→再按2→再按7
或是ALT+2+7三顆按鍵同時按...

都打不出《前置編碼(字符)ESC》.....@@|||

還是很感謝您!

蟹老闆 iT邦大師 1 級 ‧ 2019-01-29 10:53:37 檢舉

這有一批牛肉(有用資訊)好便宜/images/emoticon/emoticon33.gif

小成 iT邦高手 10 級 ‧ 2019-01-29 15:14:43 檢舉
小成 iT邦高手 10 級 ‧ 2019-01-29 16:11:43 檢舉

再補充一下
https://ithelp.ithome.com.tw/upload/images/20190129/20011048CfWz4a2hnD.png
用16進制看文件內容,那個1B(也就是ALT+27)就是前置字元

蟹老闆 iT邦大師 1 級 ‧ 2019-01-29 19:16:55 檢舉

小成/images/emoticon/emoticon12.gif
專業解析

我終於打出來了...我發現原因了…
我要按住左邊的ALT鍵後,再按下獨立字鍵上的2→7,再放開左邊ALT後,前置編碼(字符)ESC》就出來了!

我之前一直按住左邊的ALT鍵後,我是按下鍵盤W上面的2→鍵盤U上面的7....才一直打不出來!

太感謝小成大大了!

還幫忙錄影片!

0
ami_jslian
iT邦新手 5 級 ‧ 2019-01-29 09:22:41

要控制文字效果,首先要讓 DOS BOX 支援 ANSI 控制碼。
http://asika.windspeaker.co/post/3496-windows-cmd-ansi

ami_jslian大大 感謝您抽空回應!

使用您提供的連接,加上蟹老闆大大的BAT後已經可以正常顯示顏色了!

感謝您!

小成 iT邦高手 10 級 ‧ 2019-01-29 14:51:45 檢舉

呃我沒裝那個,預設應該就可以了

我要發表回答

立即登入回答