2010-11-19 27 views
2

Renk adlarını, Decimals ve Hex Parametrelerini kabul eden bir Batch COLOR komut dosyasını yeni bitirdim.Renk adlarını, Decimals ve Hex Parametrelerini kabul eden COLOR komutunu toplu olarak işleyin

Bu komut, tam olarak MS-Color komutu gibi çalışır ancak ondalık ve renk adlarını da kabul eder.

Sözdizimi ve kullanımı da dahil olmak üzere tam bir açıklama için bu betiği perimetreler olmadan çalıştırın.

İyi bir iş yapıp yapmadığımı veya geliştirilebilecek bir şey olup olmadığını merak ediyorum?

if "%_TPfore%"=="A" set "_ValidF=TRUE" && goto TWOPAR_VALID 

@echo off 
setlocal EnableDelayedExpansion 

if "%1"=="/?" goto HELP 
if "%1"=="" goto HELP 

goto BYPASSREMSTATEMENTS 
rem *********************************************************** 
rem * Easycolor was created by Edoctoor 2010     * 
rem * With the help from the good people at stackoverflow.com * 
rem * For the good people at stackoverflow.com    * 
rem *               * 
rem * Convert Color-name and Decimals Parmeters to Hex values * 
rem * then pass the VALUES to the COLOR COMMAND    * 
rem *********************************************************** 
:BYPASSREMSTATEMENTS 

set "_DEBUGGING=FALSE" 
If "%_DEBUGGING%"=="TRUE" prompt=$g && echo on && cls 

REM IF TWO PARMETERS GIVEN 
IF NOT "%2"=="" call :TWOPAR %1 %2 

REM IF ONE PARMETER GIVEN 
set _OPback=%1 
call :TWOPAR %_OPback:~0,1% %_OPback:~1,1% 

goto :eof 

rem *********************************************************** 
rem * Convert Color-name and Decimals Parmeters to Hex values * 
rem * then pass the VALUES to the COLOR COMMAND    * 
rem *********************************************************** 

:TWOPAR 
set "_TPback=%1" 
set "_TPfore=%2" 
set "_ValidB=FALSE" 
set "_ValidF=FALSE" 

FOR /L %%B IN (1,1,9) DO (
    if "%_TPback%"=="%%B"        set "_ValidB=TRUE" && goto TWOPAR_FORE 
) 

if /I "%_TPback%"=="Black"  set /A _TPback=0 && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="Blue"   set /A _TPback=1 && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="Green"  set /A _TPback=2 && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="Aqua"   set /A _TPback=3 && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="Red"   set /A _TPback=4 && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="Purple"  set /A _TPback=5 && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="Yellow"  set /A _TPback=6 && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="White"  set /A _TPback=7 && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="Gray"   set /A _TPback=8 && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="LightBlue" set /A _TPback=9 && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="LightGreen" set _TPback=A && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="LightAqua" set _TPback=B && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="LightRed"  set _TPback=C && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="LightPurple" set _TPback=D && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="LightYellow" set _TPback=E && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if /I "%_TPback%"=="BrightWhite" set _TPback=F && set "_ValidB=TRUE" && goto TWOPAR_FORE 
if "%_TPback%"=="A"        set "_ValidB=TRUE" && goto TWOPAR_FORE 
if "%_TPback%"=="B"        set "_ValidB=TRUE" && goto TWOPAR_FORE 
if "%_TPback%"=="C"        set "_ValidB=TRUE" && goto TWOPAR_FORE 
if "%_TPback%"=="D"        set "_ValidB=TRUE" && goto TWOPAR_FORE 
if "%_TPback%"=="E"        set "_ValidB=TRUE" && goto TWOPAR_FORE 
if "%_TPback%"=="F"        set "_ValidB=TRUE" && goto TWOPAR_FORE 
if "%_TPback%"=="a"        set "_ValidB=TRUE" && goto TWOPAR_FORE 
if "%_TPback%"=="b"        set "_ValidB=TRUE" && goto TWOPAR_FORE 
if "%_TPback%"=="c"        set "_ValidB=TRUE" && goto TWOPAR_FORE 
if "%_TPback%"=="d"        set "_ValidB=TRUE" && goto TWOPAR_FORE 
if "%_TPback%"=="e"        set "_ValidB=TRUE" && goto TWOPAR_FORE 
if "%_TPback%"=="f"        set "_ValidB=TRUE" && goto TWOPAR_FORE 

:TWOPAR_FORE 

FOR /L %%B IN (1,1,9) DO (
    if "%_TPfore%"=="%%B"        set "_ValidF=TRUE" && goto TWOPAR_VALID 
) 

if /I "%_TPfore%"=="Black"  set /A _TPfore=0 && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="Blue"   set /A _TPfore=1 && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="Green"  set /A _TPfore=2 && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="Aqua"   set /A _TPfore=3 && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="Red"   set /A _TPfore=4 && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="Purple"  set /A _TPfore=5 && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="Yellow"  set /A _TPfore=6 && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="White"  set /A _TPfore=7 && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="Gray"   set /A _TPfore=8 && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="LightBlue" set /A _TPfore=9 && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="LightGreen" set _TPfore=A && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="LightAqua" set _TPfore=B && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="LightRed"  set _TPfore=C && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="LightPurple" set _TPfore=D && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="LightYellow" set _TPfore=E && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if /I "%_TPfore%"=="BrightWhite" set _TPfore=F && set "_ValidF=TRUE" && goto TWOPAR_VALID 
if "%_TPfore%"=="A"        set "_ValidF=TRUE" && goto TWOPAR_VALID 
if "%_TPfore%"=="B"        set "_ValidF=TRUE" && goto TWOPAR_VALID 
if "%_TPfore%"=="C"        set "_ValidF=TRUE" && goto TWOPAR_VALID 
if "%_TPfore%"=="D"        set "_ValidF=TRUE" && goto TWOPAR_VALID 
if "%_TPfore%"=="E"        set "_ValidF=TRUE" && goto TWOPAR_VALID 
if "%_TPfore%"=="F"        set "_ValidF=TRUE" && goto TWOPAR_VALID 
if "%_TPfore%"=="a"        set "_ValidF=TRUE" && goto TWOPAR_VALID 
if "%_TPfore%"=="b"        set "_ValidF=TRUE" && goto TWOPAR_VALID 
if "%_TPfore%"=="c"        set "_ValidF=TRUE" && goto TWOPAR_VALID 
if "%_TPfore%"=="d"        set "_ValidF=TRUE" && goto TWOPAR_VALID 
if "%_TPfore%"=="e"        set "_ValidF=TRUE" && goto TWOPAR_VALID 
if "%_TPfore%"=="f"        set "_ValidF=TRUE" && goto TWOPAR_VALID 

:TWOPAR_VALID 

If "%_DEBUGGING%"=="TRUE" (
    echo TWOPAR Background is %_TPback% %_ValidB% 
    echo TWOPAR Foreground is %_TPfore% %_ValidF% 
    pause 
) 

rem I think I can remove this as the color command 
rem will provide the errolevel if the values are equal... 
rem Is that right? 
rem if Background Parameter matches Foreground ignore 
rem IF "%_TPback%"=="%_TPfore%" (
rem  set _TrueIFMatch=%errorlevel% 
rem  exit %_TrueIFMatch% 
rem) 

if "%_ValidB%"=="TRUE" (
    if "%_ValidF%"=="TRUE" (
     color %_TPback%%_TPfore% 
    ) 
) 
exit /B 

rem *********************************************************** 
rem * Display Help and exit         * 
rem *********************************************************** 

:HELP 
@echo off 
echo. 
echo Sets the default console background and foreground text colors. 
echo. 
echo EASYCOLOR ^[Background Decimal Code^] ^[Text Decimal Code^] 
echo EASYCOLOR ^[Background Color-Name^] ^[Text Color-Name^] 
echo. 
echo EASYCOLOR is compatable with the COLOR command see color /? 
echo. 
echo EASYCOLOR ^[Background HEX CODE Text HEX CODE^] 
echo. 
echo Color attributes are specified by Decimal, Color-Names, or Hex digits 
echo The first ^(Decimal, Color-Names, Hex^) value corresponds to the background color; 
echo the second ^(Decimal, Color-Names, Hex^) value corresponds to the text color. 
echo Each attribute can be any of the following values: 
echo. 
echo  Decimal == Color-Names == Hex 
echo  _____________________________ 
echo   0 == Black ======== 0 
echo   1 == Blue ========= 1 
echo   2 == Green ======== 2 
echo   3 == Aqua ========= 3 
echo   4 == Red ========== 4 
echo   5 == Purple ======= 5 
echo   6 == Yellow ======= 6 
echo   7 == White ======== 7 
echo   8 == Gray ========= 8 
echo   9 == LightBlue ==== 9 
echo   10 == LightGreen === A 
echo   11 == LightAqua ==== B 
echo   12 == LightRed ===== C 
echo   13 == LightPurple == D 
echo   14 == LightYellow == E 
echo   15 == BrightWhite == F 
echo. 
echo Help Examples: 
echo. 
echo EASYCOLOR     ^> produces this help screen. 
echo EASYCOLOR /?    ^> produces this help screen. 
echo. 
echo Decimal and Color-Names Examples: 
echo. 
echo EASYCOLOR 7 0    ^> White background with Black text. 
echo EASYCOLOR Blue White  ^> Blue background with White text. 
echo EASYCOLOR 0 LightGreen  ^> Black background with LightGreen text. 
echo. 
echo Color command and compatable Hex Examples: 
echo (Note: Hex is assumed if no space between attributes) 
echo. 
echo EASYCOLOR 0F    ^> Black background with BrightWhite text. 
echo EASYCOLOR 1B    ^> Blue background with LightAqua text. 
echo. 
echo Note 
echo. 
echo EASYCOLOR 0brightwhite  ^> Black background with LightAqua text. 
echo Because there wasn't a space between 0 and brightwhite 
echo the HEX value of 0b is assumed; wrongly. 
echo. 
echo EASYCOLOR 0 brightwhite ^> Black background with brightwhite text. 
echo as expected. 
echo. 
echo The EASYCOLOR command sets ERRORLEVEL to 1 if an attempt is made to execute 
echo the EASYCOLOR command with a foreground and background color that are the 
echo same. 
echo. 
echo. 
exit /B 
ilki için

Click here to download the complete solution

+0

yardımcı olur. Boşluklarla ayrılmış tüm renkleri olan bir "harita" veya "renk" değişkenine sahip olmak ve bir FOR döngüsüne sahip olmak ve belirteçlerden herhangi birinin belirtilen renkle eşleşip eşleşmediğini görmek gibi. –

cevap

1

güzel senaryo. TWOPAR ama dönecektir, bu yüzden "TEK Parmeter VERİLEN" kısmı da idam edilecek:

Ama iki parametre Varsa bir hata burada

REM IF TWO PARMETERS GIVEN 
IF NOT "%2"=="" call :TWOPAR %1 %2 

REM IF ONE PARMETER GIVEN 
set _OPback=%1 
call :TWOPAR %_OPback:~0,1% %_OPback:~1,1% 

bulduğumu, diyoruz.

Ve diğer genel kod önerileri.

Kendinizi tekrar etme :-)
Kod blokları hemen hemen aynıysa, bunları bir işlevle birleştirmek daha iyidir.
Arka plan ve zemin rengi için renk adlarının iki doğrulaması gibi.

@echo off 
setlocal EnableDelayedExpansion 

if "%1"=="/?" goto HELP 
if "%1"=="" goto HELP 

goto BYPASSREMSTATEMENTS 
rem *********************************************************** 
rem * Easycolor was created by Edoctoor 2010     * 
rem * With the help from the good people at stackoverflow.com * 
rem * For the good people at stackoverflow.com    * 
rem *               * 
rem * Convert Color-name and Decimals Parmeters to Hex values * 
rem * then pass the VALUES to the COLOR COMMAND    * 
rem *********************************************************** 
:BYPASSREMSTATEMENTS 

set "_DEBUGGING=FALSE" 
If "%_DEBUGGING%"=="TRUE" prompt=$g && echo on && cls 

REM IF TWO PARMETERS GIVEN 
IF NOT "%2"=="" call :TWOPAR %1 %2 & goto :eof 

REM IF ONE PARMETER GIVEN 

set _OPback=%1 
call :TWOPAR %_OPback:~0,1% %_OPback:~1,1% 

goto :eof 

rem *********************************************************** 
rem * Convert Color-name and Decimals Parmeters to Hex values * 
rem * then pass the VALUES to the COLOR COMMAND    * 
rem *********************************************************** 

:TWOPAR 
set "_TPback=%1" 
set "_TPfore=%2" 

call :AnalyzeParam _TPback _ValidB 
call :AnalyzeParam _TPfore _ValidF 

If "%_DEBUGGING%"=="TRUE" (
    echo TWOPAR Background is %_TPback% %_ValidB% 
    echo TWOPAR Foreground is %_TPfore% %_ValidF% 
    pause 
) 

rem I think I can remove this as the color command 
rem will provide the errolevel if the values are equal... 
rem Is that right? 
rem if Background Parameter matches Foreground ignore 
rem IF "%_TPback%"=="%_TPfore%" (
rem  set _TrueIFMatch=%errorlevel% 
rem  exit %_TrueIFMatch% 
rem) 

if "%_ValidB%"=="TRUE" (
    if "%_ValidF%"=="TRUE" (
     color %_TPback%%_TPfore% 
    ) 
) 
exit /B 

:AnalyzeParam <paramVariable> 
setlocal EnableDelayedExpansion 
set "value=!%1!" 
set "valid=FALSE" 

set "color[0]=Black" 
set "color[1]=Blue" 
set "color[2]=Green" 
set "color[3]=Aqua" 
set "color[4]=Red" 
set "color[5]=Purple" 
set "color[6]=Yellow" 
set "color[7]=White" 
set "color[8]=Gray" 
set "color[9]=LightBlue" 
set "color[10]=LightGreen" 
set "color[11]=LightAqua" 
set "color[12]=LightRed" 
set "color[13]=LightPurple" 
set "color[14]=LightYellow" 
set "color[15]=BrightWhite" 
for /L %%n in (0,1,15) DO (
    if /I !color[%%n]!==!value! (
     set "value=%%n" 
     set "valid=TRUE" 
     goto :AnalyzeParam_valid 
    ) 
) 
rem Test if it is a legal hex nibble character 
if /I !value! GEQ A (
    if !value! LEQ F (
     set "valid=TRUE" 
    ) 
) ELSE if !value! GEQ 0 (
    if !value! LEQ 9 (
     set "valid=TRUE" 
    ) 
) 
:AnalyzeParam_valid 
(
    ENDLOCAL 
    set %~1=%value% 
    set %~2=%valid% 
    goto :eof 
) 

Bunu döngüler İÇİN birkaç ile büyüklüğünü azaltabilir Jeb

+0

Kullandığınız tekniklerin çoğu benim için çok fazla, bana daha ileri teknikleri nasıl kullanacağınızı gösterdiğiniz için teşekkür ederiz. – Edoctoor

+0

goto: AnalyzeParam_valid, aradığım bir tekniktir; yine de, şu an hala anlamıyorum. Bu tidbit'i gözden geçirene kadar gözden geçireceğim. Komut dosyasını tamamen yeniden yazmak için zaman ayırdığınız için teşekkür ederiz. – Edoctoor

+0

Soru: Şimdi bu Soruyu tamamladınız. Cevabınızı, sorumun bulunduğu bölgeye mi kopyalarım? Cevabınız eksik olduğundan: YARDIM ve ben sizin düzeltmelerinizi ve YARDIM'ın tek bir yerde olmasını istiyorum. Üzgünüm, bu aptal bir soru ise. – Edoctoor