如何使菜单定义变量

时间:2019-02-18 17:46:29

标签: batch-file menu

我是批处理脚本的新手。我可以根据自己的需要启动基本菜单,但我需要在正确的方向上对菜单和变量进行一些调整。

因此,我希望创建一个菜单,该菜单从多个项目中选择一个就定义一个变量,以定义文件操作开始的项目的路径。

所以这是我要弄清楚如何集成的一个示例:

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

现在我知道我在这里缺少东西。如果我还不够清楚的话,我就是个白痴。如何制作一个批处理菜单,该菜单设置一个变量来执行相同的操作,多次执行,而又不会对每个代码使用唯一的操作而使代码膨胀?

3 个答案:

答案 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号中的第一个:

  1. foo
  2. bar
  3. quak
  4. 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来设置 值转换为变量名。