iT邦幫忙

0

想詢問以下CMD彩色字體 程式運作方式

  • 分享至 

  • xImage

Hi 大家好 這是我第一次發問 有任何問題還請見諒 謝謝
想詢問一下 以下程式碼中

for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  set "DEL=%%a"
)

這段是如何運作的呢?
prompt 不太清楚是拿來做甚麼的..
DEL 裡面存了甚麼, Echo出來是空的...


<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1

這段還在理解中


以下為完整程式碼

@echo off
SETLOCAL EnableDelayedExpansion
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  set "DEL=%%a"
)
rem echo say the name of the colors, don't read
:start
rem cls
call :ColorText 0a "blue"
call :ColorText 0C "green"
call :ColorText 0b "red"
echo.
call :ColorText 19 "yellow"
call :ColorText 2F "black"
call :ColorText 4e "white"

echo.
echo aaaaaa

pause

goto :eof

:ColorText
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1
goto :eof

太感謝nwm310了~!!
講解得非常詳細!!
看到你的解說 想在問個問題~
解說中 有多次提到取得16進位去分辨變數內容 是如何做到的阿~!
也可以提供搜尋關鍵字 因為我不知道該怎麼搜尋... 謝謝!!
(無法直接在下面回應..只能打在這QQ)

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
nwm310
iT邦新手 4 級 ‧ 2021-08-25 12:37:45
最佳解答

用 echo 顯示

只印出「結果」

@echo off
for /f "delims=" %%a in ('"echo hi"') do echo %%a

hi


印出「命令提示字元 + 命令」、「結果」

@echo off
for /f "delims=" %%a in ('"for %%b in (1) do echo hi"') do echo %%a

R:\>echo hi
hi

用 rem 顯示

只印出「結果」

@echo off
for /f "delims=" %%a in ('"rem"') do echo %%a

沒有印出東西


印出「命令提示字元 + 命令」

@echo off
for /f "delims=" %%a in ('"for %%b in (1) do rem"') do echo %%a

R:\>rem


改變命令提示字元、取得DEL

@echo off
for /f "delims=" %%a in ('"prompt $H & for %%b in (1) do rem"') do >out.txt echo %%a

prompt $H 用來改變命令提示字元為 後退 (清除前一個字元)
可以打 prompt /? 查詢
把%%a存到out.txt
16進位內容為: 08 20 08 20 72 65 6D 0D 0A
08 20 08 是 命令提示字元
20 是 空格
72 65 6D 是 rem
0D 0A 是 echo 命令產生的換行符號


把prompt $H 改成 prompt $H#

@echo off
for /f "delims=" %%a in ('"prompt $H# & for %%b in (1) do rem"') do >out.txt echo %%a

把%%a存到out.txt
16進位內容為: 08 20 08 23 20 72 65 6D 0D 0A
08 20 08 的後面多出一個 23 (也就是#)


用 # 切割字串

@echo off
for /f "delims=#" %%a in ('"prompt $H# & for %%b in (1) do rem"') do >out.txt echo %%a

把%%a存到out.txt
16進位內容為: 08 20 08 0D 0A


設定DEL變數

@echo off
for /f "delims=#" %%a in ('"prompt $H# & for %%b in (1) do rem"') do set "DEL=%%a"

DEL變數 16進位內容為: 08 20 08


說明

"delims="

不切割字串。把完整內容設值給 %%a

"delims=#"

用 # 切割字串。把第一段字串設值給 %%a

in (單引 雙引 雙引 單引)

雙引號是為了 特殊符號 & ( )
不使用雙引號、而使用 ^ 的寫法

for /f "delims=#" %%a in ('prompt $H# ^& for %%b in ^(1^) do rem') do set "DEL=%%a"

把DEL變數存到檔案

<nul set /p ".=%DEL%" > "%~2"

把%DEL%的內容,存到檔名為"%~2"的檔案裡
如果用echo來存

> "%~2" echo %DEL%

除了%DEL%本身的內容,還會多了 0D 0A (換行符號)


用findstr 顯示顏色

a.txt 的內容是 111 (後面有換行符號)

R:\>findstr "." a.txt
111

兩個檔名時,才會顯示檔名

R:\>findstr "." a.txt a.txt
a.txt:111
a.txt:111

a.txt 的內容是 111 (後面沒有換行符號)

R:\>findstr "." a.txt a.txt
a.txt:111a.txt:111

nul也是一種檔名

R:\>findstr "." a.txt nul
a.txt:111

/a:2F 使a.txt: 有顏色
color /? 可以查詢顏色代碼

R:\>findstr /a:2F "." a.txt nul
a.txt:111

當a.txt的 16進位內容是 08 20 08
刪除冒號

R:\>findstr /a:2F "." a.txt nul
a.txt

參考

cmd - Code for changing colors in batch : How is it working? - Stack Overflow

我要發表回答

立即登入回答