【问题标题】:Batch code: how to pass a parameter choosing from an input list?批处理代码:如何传递从输入列表中选择的参数?
【发布时间】:2014-06-12 09:12:21
【问题描述】:

我是这个论坛的新手,所以我希望尊重你的所有规则,如果不是请原谅我!

我刚刚开始研究有关批处理文件的知识,我正在尝试通过批处理传递参数来执行一个简单的程序(最后一个目标是提交一个传递日期参数的 SAS 程序)。

是否可以激活一种列表,我可以在其中选择一些预定义的参数?

-->这是我工作的真正目的

我正在尝试“玩”这段代码:

    @echo off

    title Setting up execution period

    echo Insert your date in the format GGMMMAAAA (es: '31DEC2003'D).

    SET /p data_par=Insert the date to filter datas:

    SET first_byte=%data_par:~1,1%

    if "%first_byte%"=="" (

           GOTO tag1 

    ) else (

           GOTO tag2
)

:tag1
   msg * Missing value

:tag2
   msg * Well done!

pause

我尝试了很多方法,但是似乎没有执行IF语句,我不知道我哪里错了。

另一个问题:为什么在我按“Enter”后提示关闭(执行 set/p 命令后)?

--> 将“暂停”命令放在脚本末尾已解决。

感谢大家的关注,

最好的问候!

Squotty

【问题讨论】:

  • 只是一个提示:%var:~1,1% 不是第一个字节,而是第二个字节(它从零开始计数)。
  • 如果你只是按回车,%data_par% 将为空,所以%data_par:~1,1% 没有意义。为什么要提取单个字符进行检查?只需使用if "%data_par%"=="" (

标签: batch-file batch-processing


【解决方案1】:

在代码末尾添加pause 以查看错误消息。

使用elseif 的正确语法是:

if "a"=="b" (dosomething) else (dosemethingelse)

你可以写成几行,但是有规则,在哪里设置括号:

if "a"=="b" (
  echo this is code for something
  rem more lines possible
) else (
  echo this is code for something else
  rem more lines possible
)

第一个( 必须与if 在同一行。

) else ( 必须在一行。

如果您使用 set /p 按 Enter 键,则变量保持不变(可能为空),因此您的代码将继续输入代码并点击行 else。这里会告诉你“else 不被识别为命令……”

在您的tagx,您应该告诉批处理,在哪里停止执行。使用goto :eof 停止执行或使用goto somewhere 在其他地方继续。如果你不这样做,它将继续下一行。

例子:

:tag1
   msg * Missing value
   goto :eof
:tag2
   msg * Well done!
   goto :continue
pause
:continue
REM go on with the program...

(注意:永远无法到达pause。我让它在那里向您展示事情是如何运作的)

编辑您可以检查格式是否正确,而不仅仅是检查某些输入:

echo %data_par%|findstr /r "[0-3][0-9][A-Z][A-Z][A-Z][1-2]0[0-9][0-9]">nul && (
  echo correct format 
  goto continue
)  || (
  echo wrong format
  goto startover
)

它不是防弹的(例如,38ABC2019 将被视为“正确”),但至少它会检查格式是否正确(例如,15.12.201912/15/2014 将被视为“不正确”)

【讨论】:

  • 非常感谢您的回答,现在情况有所好转,但仍与我想要的不同。我尝试进行更改,但现在它始终处于“做得好”的状态,即使我没有输入任何参数。顺便说一句,有没有办法让用户从给定日期列表中进行选择?再次感谢。 Squotty
  • 您能否编辑您的问题以显示您的实际代码和问题所在?我认为这是因为“tag1”代码末尾缺少exitgoto :eof。在msg * Missing value 之后,批处理文件只是继续下一行,忽略下一个标签并执行msg * Well done!
  • 您好 Stephan, 再次感谢您的回答和有关正确格式的建议。现在 if 循环是正确的,我正在尝试去,但我在检查格式时遇到了一些问题。不幸的是,目前我没有任何时间,我会在接下来的几天继续尝试,如果需要帮助,我会更新我的评论!再次感谢 Squotty
  • 如果一般只用于在屏幕上显示消息,为什么要使用“echo”语句来检查格式?
  • echo 用来写东西。下面的管道符号| 接受这个东西(而不是把它写到屏幕上)并将它传递给下面的命令findstr,它搜索一个模式,如果它找到一个匹配的模式(&&),它就会执行一些命令,如果模式不匹配(||),它会执行另一个命令。顺便说一句:我刚刚注意到,我的代码确实再次将变量输出到屏幕上。我纠正了这一点。
【解决方案2】:
@ECHO OFF
SETLOCAL

SET "item1=date1"
SET "item2=date2"
SET "item3=date3"
SET "item4=date4"

FOR /l %%a IN (1,1,4) DO CALL ECHO(%%a. %%item%%a%%
ECHO(U. User-specified
choice /c 1234u
CALL SET selection=%%item%errorlevel%%%
IF NOT DEFINED selection (
 SET /p selection="Your date-selection ? "
)
IF NOT DEFINED selection ECHO No selection made&GOTO :EOF 
ECHO selection is %selection%

GOTO :EOF

此代码可能会有所帮助。

使用批处理窗口开发批处理代码是很正常的。只需设置command prompt 的快捷方式(开始>程序>附件),您就可以一遍又一遍地运行脚本并在屏幕上保留结果,而无需使用“暂停”。可以通过在提示中使用notepad batchfilename.bat 来完成编辑(如果您使用记事本作为编辑器 - 如果使用更好的东西,则替换该程序的名称)。您可以通过执行exit 命令退出批处理窗口。

您还可以使用commandname /? 获得有关批处理命令的帮助 - 它通常很神秘,而且有很多怪癖。此处提供有关 SO 的广泛帮助。

【讨论】:

  • 嗨 Magoo,非常感谢您的帮助!从提示符而不是文件上的“双击”执行我的 bat 很有用,但我注意到同一个程序的不同行为: - 如果我通过双击执行它工作正常 - 如果我从提示符运行它它没有为 IF 条件应用正确的逻辑。我的意思是,如果我在不输入任何参数的情况下按 Enter 键,程序会告诉我“做得好”。为什么?!?!我认为您的代码对我来说有点难以理解,我真的是从 bat 文件开始...我会尝试研究它:) 再次感谢!
  • 如果从 cmd 行启动它,该变量可能仍是上次运行时设置的。如果您只点击enter,该变量将保持不变。我不知道,您的最新代码如何。如果您仍然尝试从输入中提取单个字符,那么当输入为“空”时,这也会带来麻烦。
猜你喜欢
  • 2016-07-03
  • 1970-01-01
  • 2019-01-04
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 2010-09-06
相关资源
最近更新 更多