Page 1 of 1

color based on file extension

Posted: 16 Dec 2020 12:18
by Weshuggah
Hello

So that's a part of my script that lists files in a folder and displays them so I can select one and change its extension. It works as expected but I would like to add colours based on file extensions. For exemple .dll files show in green and .bak files show in red.

In the current state it shows the list in red no matter the extensions.

Code: Select all

@echo off
:menu4
cls
echo.
color 0a
	
setlocal enabledelayedexpansion

	set Index=1
	for %%i in (Mods\*) do (
	set "SubFiles[!Index!]=%%i"
	set /a Index+=1
	)
	set /a UBound=Index-1
	
	for /l %%i in (1,1,%UBound%) do (
	echo   %%i. [91m!SubFiles[%%i]![92m          rem  Using Ansi escape color codes 
	)
	
	
		:choiceloop
		echo.  
		set /p Choice=  Enter a number to change file extension :
		if "%Choice%"=="" goto choiceloop
		if %Choice% LSS 1 goto choiceloop
		if "%Choice%"=="f" goto main

		set SubFiles=!SubFiles[%Choice%]!
		ren !SubFiles[%Choice%]! "*.dll"
		ren !SubFiles[%Choice%]! "*.bak"
	
		goto menu4

Re: color based on file extension

Posted: 16 Dec 2020 16:15
by Squashman
Use an IF command to compare the file extension and call out to Carlos' Color Function.

Re: color based on file extension

Posted: 16 Dec 2020 20:37
by T3RRY
Squashman wrote:
16 Dec 2020 16:15
Use an IF command to compare the file extension and call out to Carlos' Color Function.
An alternative to the Color Function is to use a color macro

Code: Select all

@Echo off
Setlocal DisableDelayedExpansion
 If "!![" == "[" (
  Echo/%%COL%% macro must be defined prior to delayed expansion being enabled
  Goto :end
 )
rem /* Macro Definitions */
 For /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (set "DEL=%%a")
rem /* %hCol% - Color macro; No error checking. Usage: (%hCol:?=HEXVALUE%Output String) */
 Set "hCol=For %%o in (1 2)Do if %%o==2 (( <nul set /p ".=%DEL%" > "!os:\n$=!" ) & ( findstr /v /a:? /R "^$" "!os:\n$=!" nul ) & ( del "!os:\n$=!" > nul 2>&1 ) & (Set "testos=!os:\n$=!" & If not "!testos!" == "!os!" (Echo/)))Else Set os="
Setlocal EnableDelayedExpansion
 PUSHD "%~dp0"
rem /* to force a new line; terminate an output string with \n$ */
(%hCol:?=40% This is an example of usage)&(%hCol:?=0d%. Done\n$.)
%hCol:?=30%bye
:end
 POPD
 Endlocal & Endlocal
Goto :Eof

Re: color based on file extension

Posted: 17 Dec 2020 05:49
by Weshuggah
Ok I'm not sure where and how to use the IF command without breaking the index, could you detail it please? It's my first script only had experience with ahk before.

Re: color based on file extension

Posted: 18 Dec 2020 02:28
by Meerkat
Of course there are no single way on where to put the IF command. I think the "basic" (and not the shortest code) way is to have a separate pseudo-array for file extensions: (Note: I did not test this, and please remove the "<-- Addition #N" in your actual code)

Code: Select all

	...
	set Index=1
	for %%i in (Mods\*) do (
		set "SubFiles[!Index!]=%%i"
		set "ExtFiles[!index!]=%%~xi"       <-- Addition #1
		set /a Index+=1
	)
	set /a UBound=Index-1
	
	for /l %%i in (1,1,%UBound%) do (
		if /i "!ExtFiles[%%i]!"==".dll" (       <-- Addition #2
			rem show in green
			rem I don't know escape color codes stuff
		) else if /i "!ExtFiles[%%i]!" == ".bak" (
			rem show in red instead
		)
	)
Info on Addition #1 can be found in the command for /? (at the very end of the documentation), or here https://ss64.com/nt/syntax-args.html (see "parameter extensions").

Addition #2 is the IF command; documentation can be found in the command if /?. The /i switch means case-insensitive string comparison.

Meerkat