我是批处理脚本的新手。我可以根据自己的需要启动基本菜单,但我需要在正确的方向上对菜单和变量进行一些调整。
因此,我希望创建一个菜单,该菜单从多个项目中选择一个就定义一个变量,以定义文件操作开始的项目的路径。
所以这是我要弄清楚如何集成的一个示例:
CHOICE /N /C:1234 /M "Option: "
IF ERRORLEVEL ==4 SET foo
IF ERRORLEVEL ==3 SET bar
IF ERRORLEVEL ==2 SET quak
IF ERRORLEVEL ==1 SET baz
[something something define %bark% from above]
rem overwrite file.png with new option
copy %src%\%bark%\file.png %des%\%quak%\file.png
现在我知道我在这里缺少东西。如果我还不够清楚的话,我就是个白痴。如何制作一个批处理菜单,该菜单设置一个变量来执行相同的操作,多次执行,而又不会对每个代码使用唯一的操作而使代码膨胀?
答案 0 :(得分:0)
您可以使用两种不同的方法来执行此操作:第一种是完全删除显示的==
,因为这是使用choice
命令时执行此操作的最常见方法:>
choice /N /C:1234 /M "Option: "
if errorlevel 4 set foo & goto :foo
if errorlevel 3 set bar & goto :bar
if errorlevel 2 set quak & goto :quak
if errorlevel 1 set baz & goto :baz
[something something define %bark% from above]
rem overwrite file.png with new option
copy %src%\%bark%\file.png %des%\%quak%\file.png
降序仅是因为if errorlevel x
表示errorlevel
变量是否更大大于 或等于 x
。
第二种方法(不是很常见),用于在条件为true时设置变量,方法如下(请注意,此处我们不介意顺序):
choice /N /C:1234 /M "Option: "
if %errorlevel% EQU 4 set foo & goto :foo
if %errorlevel% EQU 3 set bar & goto :bar
if %errorlevel% EQU 2 set quak & goto :quak
if %errorlevel% EQU 1 set baz & goto :baz
[something something define %bark% from above]
rem overwrite file.png with new option
copy %src%\%bark%\file.png %des%\%quak%\file.png
您可以在此处用EQU
替换==
,尽管不建议这样做。
请注意,如果要在条件为true的情况下 设置 ,请使用第二种方法,并以set "var=value"
格式设置变量。
例如:
if %errorlevel% EQU 4 set "foo=1"
if %errorlevel% EQU 3 set "bar=2"
if %errorlevel% EQU 2 set "quak=3"
if %errorlevel% EQU 1 set "baz=4"
或其他。
要不执行全部4个if
,可以在此处添加GoTo
:
if %errorlevel% EQU 4 set "foo=1" & goto :foo
if %errorlevel% EQU 3 set "bar=2" & goto :bar
if %errorlevel% EQU 2 set "quak=3" & goto :quak
if %errorlevel% EQU 1 set "baz=4" & goto :baz
,然后将示例子例程替换为实际名称。
有关使用的命令的更多信息,请输入cmd.exe
:
if /?
choice /?
set /?
goto /?
答案 1 :(得分:0)
您的主要问题在这里:
IF ERRORLEVEL ==N..
它应该是:
if "%errorlevel%"=="N"
或
if errorlevel N
如果您真的想设置一些东西,那么我会说去label
并在那里设置一些东西:
CHOICE /N /C:1234 /M "Option: "
if "%errorlevel%"=="4" goto :foo
if "%errorlevel%"=="3" goto :bar
if "%errorlevel%"=="2" goto :quak
if "%errorlevel%"=="1" goto :baz
:foo
set foo=bar
goto :eof
:bar
...
但是我个人更喜欢直接在if
语句中执行操作,而不是必须goto
使用许多标签。
CHOICE /N /C:1234 /M "Option: "
if "%errorlevel%"=="4" (
set "foo=bar"
goto :next
)
if "%errorlevel%"=="3" (
set "foo=bar"
goto :next
)
if "%errorlevel%"=="2" (
set "foo=bar"
goto :next
)
if "%errorlevel%"=="1" (
set "foo=bar"
goto :next
)
:next
echo %foo%
最后,仅此而已,我们100%都需要一个值,因此请确保您使用set "foo=bar"
,否则它只会回显带有值的变量,只要它确实存在。您可以通过运行cmd.exe并执行set "foo=bar"
然后执行set foo
来查看结果来进行测试。
答案 2 :(得分:0)
@echo off
setlocal
choice /n /c:1234 /m "Press a key: "
for /f "tokens=%errorlevel% delims=|" %%A in (
"foo|bar|quak|baz"
) do set "result=%%A"
echo %result%
这会将set
变量名result
更改为所选值
errorlevel
返回的choice
号中的第一个:
foo
bar
quak
baz
如果按下3
,则result
被设置为quak
的值。
字符串"foo|bar|quak|baz"
用|
分隔以创建
4个标记的值,它们与1234
的序列对齐
choice
的选项。
如果值是其他值,则可以根据需要进行更改。
@echo off
setlocal
rem Test 1.
call :select "1|foo" "2|bar" "3|quak" "4|bar"
echo Result: %result%
rem Test 2.
call :select "a|apple" "b|orange" "c|banana"
echo Result: %result%
rem Test 3.
call :select
echo Result: %result%
rem Test 4 repeat.
:menu
call :select "1|car" "2|boat" "3|airplane"
echo Result: %result%
call :select "1|quit" "2|restart menu"
if /i "%result%" == "quit" goto :endmenu
goto :menu
:endmenu
exit /b
:select
setlocal
set args=%*
set "choices="
set "values="
rem Set default choices and values if needed.
if "%~1" == "" set args="y|y" "n|n"
rem Display menu with choices and values.
echo(
for %%A in (%args%) do (
for /f "tokens=1* delims=|" %%B in ("%%~A") do (
echo %%B %%C
if defined choices (
call set "choices=%%choices%%|%%B"
) else set "choices=%%B"
if defined values (
call set "values=%%values%%|%%C"
) else set "values=%%C"
)
)
echo(
rem Prompt to press a key.
choice /n /c:%choices:|=% /m "Press a key: "
rem Get the value from the errorlevel.
for /f "tokens=%errorlevel% delims=|" %%A in ("%values%") do set "result=%%A"
rem Set nonlocal result.
endlocal & set "result=%result%"
exit /b
这使用名为:select
的标签,该标签执行以下操作:
echo
菜单选项和值。choice
提示。result
设置为所选值。传递给:select
的被叫标签的参数是
每个都用双引号引起来。如果您将a
分配为
选择键和apple
作为结果值,那么您将
使用参数"a|apple"
。 |
分隔符分隔
键和值。
您无需更改标签中的代码
:select
,除非您要改进它。
您提到过“ 同一件事,没有膨胀”,
因此Test 4 repeat
可能会做您想要的。
请注意,:menu
和:endmenu
标签之间的代码是
比您不得不重复菜单显示要少得多,
选择命令并处理errorlevel
来设置
值转换为变量名。