Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何要求用户输入3个RGB值(红色、绿色、蓝色),并使用输入掩码验证输入的值?_Batch File - Fatal编程技术网

Batch file 如何要求用户输入3个RGB值(红色、绿色、蓝色),并使用输入掩码验证输入的值?

Batch file 如何要求用户输入3个RGB值(红色、绿色、蓝色),并使用输入掩码验证输入的值?,batch-file,Batch File,我想让批处理文件的用户设置自定义RGB颜色,例如255255,最好都存储在一个环境变量中 我知道我可以问三次这个问题,检查值是GEQ 0和LEQ 255,然后用逗号按正确顺序将它们分组到第四个变量中 但肯定有更好的办法,不是吗 确保用户正确输入颜色代码的最佳方法是什么 比如使用输入掩码000000000 我是批处理文件编码的新手,虽然这让我陷入困境,但我通过四处搜索解决了很多问题。不是确保他们正确输入代码,而是定义并应用规则,将所有超出范围的输入转换为有效值,并可能将语法错误的输入转换为预定义的

我想让批处理文件的用户设置自定义RGB颜色,例如
255255
,最好都存储在一个环境变量中

我知道我可以问三次这个问题,检查值是
GEQ 0
LEQ 255
,然后用逗号按正确顺序将它们分组到第四个变量中

但肯定有更好的办法,不是吗

确保用户正确输入颜色代码的最佳方法是什么

比如使用输入掩码
000000000

我是批处理文件编码的新手,虽然这让我陷入困境,但我通过四处搜索解决了很多问题。

不是确保他们正确输入代码,而是定义并应用规则,将所有超出范围的输入转换为有效值,并可能将语法错误的输入转换为预定义的默认值,例如:

@ECHO OFF
SETLOCAL EnableExtensions
    rem preset default values for particular colors
set /A _r=255
set /A _g=255
set /A _b=255
    rem build `_RGB` variable from particular colors
set "_RGB=%_r%,%_g%,%_b%"
    rem ask a user for input
set /P "_RGB=custom RGB color (enter a comma delimited list, default %_RGB%): "
    rem parse user's input
for /F "tokens=1,2,3 delims=, " %%G in ("%_RGB%") do (
      rem compute particular colors so always come between 0 and 255
  2>NUL set /A _r=^( 1000%%~G %% 1000 ^) %% 256
  2>NUL set /A _g=^( 1000%%~H %% 1000 ^) %% 256
  2>NUL set /A _b=^( 1000%%~I %% 1000 ^) %% 256
)
    rem rebuild `_RGB` variable
set "_RGB=%_r%,%_g%,%_b%"
echo result %_RGB%
测试怪异的输入组合,如
a、b、09
-1、-2、-3
0、xyz
等。例如,无效的
-1、-2、-3
三重结果(令人惊讶?
231230229

资源(必读,不完整):

  • (命令参考)
  • (其他特殊性)
  • %~G
    等特殊页面)
  • 2>NUL
    等特殊页面)
  • ^(
    ^)
    等特殊页面)
更新:添加了另一种允许十六进制或八进制输入的方法

@ECHO OFF
SETLOCAL EnableExtensions
rem preset variables
set /A _r=255
set /A _g=255
set /A _b=255
rem build auxiliary `__RGB` variable from particular colors
set "__RGB=%_r%,%_g%,%_b%"

rem ask a user for input
set /P "__RGB=custom RGB color (enter a comma delimited list, default %__RGB%): "

rem parse user's input (updated `delims=,- `)
for /F "tokens=1,2,3 delims=,- " %%G in ("%__RGB%") do (
  rem compute particular colors so always come between 0 and 255
  2>NUL set /A _r=^( 1000%%G %% 1000 ^) %% 256
  2>NUL set /A _g=^( 1000%%H %% 1000 ^) %% 256
  2>NUL set /A _b=^( 1000%%I %% 1000 ^) %% 256
)
rem rebuild `_RGB` variable
set "_RGB=%_r%,%_g%,%_b%"
echo 1st result %_RGB%

rem parse user's input - another approach 
rem allows hexadecimal or octal input e.g. 0xAA or 0252 for decimal 170   
for /F "tokens=1,2,3 delims=, " %%G in ("%__RGB%") do (
  rem compute particular colors so always come between 0 and 255
  2>NUL set /A "_r=( %%G %% 256 + 16777216 ) %% 256"
  2>NUL set /A "_g=( %%H %% 256 + 16777216 ) %% 256"
  2>NUL set /A "_b=( %%I %% 256 + 16777216 ) %% 256"
)
rem rebuild `_RGB` variable
set "_RGB=%_r%,%_g%,%_b%"
echo 2nd result %_RGB%
样本输出:

==> D:\bat\SO\41178141.bat
custom RGB color (enter a comma delimited list, default 255,255,255): 0xAA, 0252, -100
1st result 255,252,100
2nd result 170,170,156

==>
与其确保他们正确输入代码,不如定义并应用规则,将所有超出范围的输入转换为有效值,并将可能语法错误的输入转换为预定义的默认值,例如:

@ECHO OFF
SETLOCAL EnableExtensions
    rem preset default values for particular colors
set /A _r=255
set /A _g=255
set /A _b=255
    rem build `_RGB` variable from particular colors
set "_RGB=%_r%,%_g%,%_b%"
    rem ask a user for input
set /P "_RGB=custom RGB color (enter a comma delimited list, default %_RGB%): "
    rem parse user's input
for /F "tokens=1,2,3 delims=, " %%G in ("%_RGB%") do (
      rem compute particular colors so always come between 0 and 255
  2>NUL set /A _r=^( 1000%%~G %% 1000 ^) %% 256
  2>NUL set /A _g=^( 1000%%~H %% 1000 ^) %% 256
  2>NUL set /A _b=^( 1000%%~I %% 1000 ^) %% 256
)
    rem rebuild `_RGB` variable
set "_RGB=%_r%,%_g%,%_b%"
echo result %_RGB%
测试怪异的输入组合,如
a、b、09
-1、-2、-3
0、xyz
等。例如,无效的
-1、-2、-3
三重结果(令人惊讶?
231230229

资源(必读,不完整):

  • (命令参考)
  • (其他特殊性)
  • %~G
    等特殊页面)
  • 2>NUL
    等特殊页面)
  • ^(
    ^)
    等特殊页面)
更新:添加了另一种允许十六进制或八进制输入的方法

@ECHO OFF
SETLOCAL EnableExtensions
rem preset variables
set /A _r=255
set /A _g=255
set /A _b=255
rem build auxiliary `__RGB` variable from particular colors
set "__RGB=%_r%,%_g%,%_b%"

rem ask a user for input
set /P "__RGB=custom RGB color (enter a comma delimited list, default %__RGB%): "

rem parse user's input (updated `delims=,- `)
for /F "tokens=1,2,3 delims=,- " %%G in ("%__RGB%") do (
  rem compute particular colors so always come between 0 and 255
  2>NUL set /A _r=^( 1000%%G %% 1000 ^) %% 256
  2>NUL set /A _g=^( 1000%%H %% 1000 ^) %% 256
  2>NUL set /A _b=^( 1000%%I %% 1000 ^) %% 256
)
rem rebuild `_RGB` variable
set "_RGB=%_r%,%_g%,%_b%"
echo 1st result %_RGB%

rem parse user's input - another approach 
rem allows hexadecimal or octal input e.g. 0xAA or 0252 for decimal 170   
for /F "tokens=1,2,3 delims=, " %%G in ("%__RGB%") do (
  rem compute particular colors so always come between 0 and 255
  2>NUL set /A "_r=( %%G %% 256 + 16777216 ) %% 256"
  2>NUL set /A "_g=( %%H %% 256 + 16777216 ) %% 256"
  2>NUL set /A "_b=( %%I %% 256 + 16777216 ) %% 256"
)
rem rebuild `_RGB` variable
set "_RGB=%_r%,%_g%,%_b%"
echo 2nd result %_RGB%
样本输出:

==> D:\bat\SO\41178141.bat
custom RGB color (enter a comma delimited list, default 255,255,255): 0xAA, 0252, -100
1st result 255,252,100
2nd result 170,170,156

==>
@ECHO关闭
SETLOCAL
::在命令行中输入的数据?
设置“rgb=%*”
对于%%a(a错误,R级别,G级别,B级别),请设置“%%a=”
如果已定义rgb调用:选中%*&转到显示
对于%%a英寸(rlevel、红色、glevel、绿色、blevel、蓝色),请执行以下操作(
如果定义rgb(
呼叫:getlevel%%a
如果定义了blevel GOTO show
设置“rgb=”
)否则设置“rgb=%%a”
如果定义了错误,则转到错误
)
:显示
如果定义了错误,则转到错误
如果未定义blevel GOTO错误
回显%rgb%
后藤:EOF
:错误
找到无效的回送数据
设置“rgb=”
后藤:eof
:getlevel
设置/p“%rgb%=%1的级别?”
呼叫:检查%rlevel%%glevel%%blevel%
后藤:eof
:检查
设置“rlevel=%1”
设置“glevel=%2”
设置“blevel=%3”
呼叫:验证%*
设置“rgb=%1,%2,%3”
后藤:eof
:验证
设置“rgb=%1”
如果未定义rgb转到:eof
如果“%rgb:~3%”neq“转到seterr”
设置“rgb=00%rgb%”
设置/a rgb=1%rgb:~-3%2>NUL
如果%ERRORLEVEL%neq 0转到seterr
如果%rgb%geq 1256转到seterr
如果%rgb%lss 1000转到seterr
shift&GOTO验证
:seterr
设置“A错误=y”
后藤:eof
有趣的练习

我的方法是累积条目并逐步检查

:check
将三个值设置为
r/g/blevel
然后验证每个值,通过设置
a错误来拒绝过长或超出范围的参数

为了有效,
a错误必须清除,
b级别
必须包含一个值

@ECHO OFF
SETLOCAL
::在命令行中输入的数据?
设置“rgb=%*”
对于%%a(a错误,R级别,G级别,B级别),请设置“%%a=”
如果已定义rgb调用:选中%*&转到显示
对于%%a英寸(rlevel、红色、glevel、绿色、blevel、蓝色),请执行以下操作(
如果定义rgb(
呼叫:getlevel%%a
如果定义了blevel GOTO show
设置“rgb=”
)否则设置“rgb=%%a”
如果定义了错误,则转到错误
)
:显示
如果定义了错误,则转到错误
如果未定义blevel GOTO错误
回显%rgb%
后藤:EOF
:错误
找到无效的回送数据
设置“rgb=”
后藤:eof
:getlevel
设置/p“%rgb%=%1的级别?”
呼叫:检查%rlevel%%glevel%%blevel%
后藤:eof
:检查
设置“rlevel=%1”
设置“glevel=%2”
设置“blevel=%3”
呼叫:验证%*
设置“rgb=%1,%2,%3”
后藤:eof
:验证
设置“rgb=%1”
如果未定义rgb转到:eof
如果“%rgb:~3%”neq“转到seterr”
设置“rgb=00%rgb%”
设置/a rgb=1%rgb:~-3%2>NUL
如果%ERRORLEVEL%neq 0转到seterr
如果%rgb%geq 1256转到seterr
如果%rgb%lss 1000转到seterr
shift&GOTO验证
:seterr
设置“A错误=y”
后藤:eof
有趣的练习

我的方法是累积条目并逐步检查

:check
将三个值设置为
r/g/blevel
然后验证每个值,通过设置
a错误来拒绝过长或超出范围的参数

为了有效,
a错误
必须是清晰的,
b级别
必须包含一个值

用以检查输入掩码如何

@echo关闭
:输入
设置“RGB=”
set/P RGB=“请以“000000000”格式输入RGB颜色值:”
如果定义了RGB集“RGB=%RGB:=”%
(回音(“%RGB%”)findstr/R^
/C:“^\”[0-1][0-9][0-9]^[0-1][0-9][0-9]^[0-1][0-9][0-9]\”$”^
/C:“^\”2[0-4][0-9]^,2[0-4][0-9]^,2[0-4][0-9]\“$”^
/C:“^\”25[0-5]^,25[0-5]^,25[0-5]\“$”^
>nul)| |转到:输入
当然,这并不包括所有的组合,但它给出了我的意思


为了完整起见,以下是具有所有输入掩码组合的相同代码:

@echo关闭
:输入
设置“RGB=”
set/P RGB=“请以“000000000”格式输入RGB颜色值:”
如果定义了RGB,则设置“RGB=%R”