PowerShell
Link to original code text
here my code :
FUNCTION NEW-ANSIBAR-16M
{
[cmdletbinding()]
PARAM (
[PARAMETER(Mandatory, HelpMessage = "Enter a range of 16M color values, e.g. (1..255)")]
[VALIDATENOTNULLOREMPTY()]
[int[]]
$RANGE_R,
[int[]]
$RANGE_G,
[int[]]
$RANGE_B,
[Parameter(HelpMessage = "How many spaces do you want in the bar? This will increase the length of the bar.")]
[int]
$Spacing = 1
)
$ESC = "$([CHAR]0X1b)"
$OUT = @()
$BLANK = " " * $Spacing
$out += $RANGE_R | ForEach-Object { # ◄--- I need to include $Range_G and $Range_B.
"$esc[48;2;$($_);$($_);$($_);1m$($blank)$esc[0m"
# now it's in shades of gray because it's still the same variable for the other 2 values ?
}
$OUT -JOIN ""
}
**NEW-ANSIBAR-16M -RANGE_R (1..255) -RANGE_G (100..150) -RANGE_B (100..150) -Spacing 1**
Should I try iteratively ? Or is there another way to do it ?
I tried with others ForEach-Object but it gave errors.
Thank you very much ! I need this result bot brown degraded and return to normal.
You can avoid using 3 loops if you use the zip function from .NET LINQ
Calling from powershell is a bit tricky, but is not so bad if you're using powershell 7.3+
Here's how you could do it:
$r_R = [Linq.Enumerable]::OfType[int]($RANGE_R)
$r_G = [Linq.Enumerable]::OfType[int]($RANGE_G)
$r_B = [Linq.Enumerable]::OfType[int]($RANGE_B)
$out += [Linq.Enumerable]::Zip[int,int,int]($r_R,$r_G, $r_B) | foreach {
"$esc[48;2;$($_.Item1);$($_.Item2);$($_.Item3);1m$($blank)$esc[0m"
}
You can adapt this to use StringBuilder
as per the other answer.