Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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 批处理文件显示提示不正确_Batch File - Fatal编程技术网

Batch file 批处理文件显示提示不正确

Batch file 批处理文件显示提示不正确,batch-file,Batch File,下面的批处理有两个问题。第一个是,当批处理文件打开时,提示用户一个“是/否”问题: 问题1 Has the check been done 如果此问题的答案为“y”,则会显示另一个“y/n”问题 问题2 Do you want to send the DOSE report 如果问题1的答案为“n”,则调用检查功能并显示另一个问题。但是,当前以粗体显示的行将进入第二部分(再见功能)。我做错了什么?谢谢:) 当前批次 @ECHO OFF :: ask user :choice set /

下面的批处理有两个问题。第一个是,当
批处理
文件打开时,提示用户一个“是/否”问题:

问题1

Has the check been done
如果此问题的答案为“y”,则会显示另一个“y/n”问题

问题2

Do you want to send the DOSE report
如果问题1的答案为“n”,则调用检查功能并显示另一个问题。但是,当前以粗体显示的行将进入第二部分(再见功能)。我做错了什么?谢谢:)

当前批次

@ECHO OFF
:: ask user 
 :choice
 set /P c=Has the check been done [y/n]
 if /i %c%==y (
 set /P c=Do you want to send the DOSE report[y/n]?
 ) else (
 if /i %c%==n goto check
 )
 if /i %c%==y ( 
"L:\NGS\HLA LAB\total quality management\QC & QA\DOSE reports\DOSE reporting form.xlsm"
 ) else (
 if /i %c%==n goto goodbye
 )
 :check
 set /P c=Do you want to perform the check [y/n]
 if /i %c%==y (
 echo "perform check and hit enter when complete" 
 pause goto choice
 )    else (
 if /i %c%==n goto goodbye
 :: count loop
 set var1=0
 :loop
 set /a var1=%var1%+1

 echo %var1%

 if %var1% EQU 1 (
 goto end
 ) else (
 goto loop
 )
 :end
 echo "the DOSE report has already been sent by %USERNAME% on %DATE% at   %TIME%"
 :goodbye
 echo "goodbye"
 TIMEOUT 2 /nobreak
 exit

首先,
:choice
中的if-else语句缺少结束符

这里有一个关于用户输入的重要提示,千万不要相信它。尝试在第一个字段中输入y/n以外的内容

:choice
set /p c=Has the check been done [y/n]
 if /i %c%==y (
   set /p c=Do you want to send the DOSE report[y/n]?
  ) else (
     if /i %c%==n goto check
)
如果您在第一个If-else中输入了无效的内容,例如某人尝试键入
no
而不是
n
,它将无法将其返回到
:choice
,因为它只检查
n
y

并最终通过脚本运行。在您的情况下,它在以下步骤之前失败了if语句:check并启动
:check
的过程,但在check中也出现了同样的问题,它将运行到
::count loop
和以下命令,在这些命令中它可能会弄乱您的数据

在每个if-else语句之后,添加默认操作是非常安全的做法,例如

:choice
set /p c=Has the check been done [y/n]
 if /i %c%==y (
   set /p c=Do you want to send the DOSE report[y/n]?
  ) else (
    if /i %c%==n goto check
)

:[ If both if statements are false, it will reach this line: ]
cls
echo Error: "%c%" is not y/n.
pause
goto :choice
另外需要注意的是,如果没有输入任何内容,则会发生错误。您可以通过检查变量是否在
set/p c=检查完成之后定义[y/n]
来解决此问题,方法是使用:

 if not defined c (
   cls
   echo Error: Input cannot be empty!
   pause
   goto :choice
)
因此,进行第一次检查的正确方法是:

:choice
set /p c=Has the check been done [y/n]
:[Empty check ]
if not defined c cls & echo Error: Input cannot be empty! & pause & goto :choice
 if /i "%c%==y" (
   set /p c=Do you want to send the DOSE report[y/n]?
  ) else (
    if /i "%c%==n" goto check
)

:[ Invalid input ]
cls & echo Error: "%c%" is not y/n. & pause & goto :choice

直接回答你的问题。。。老实说,我不知道你在问什么。我在破译“我正试图让下面的批处理文件在计数器%var1递增时,只有在“y”和语法不正确的情况下”时遇到问题

我没有看到任何明显的语法错误,但您的脚本确实存在不少逻辑问题。实际上,
%var1%
的值正在增加。在
设置/a Var1+=1
之后放置一个
echo Var1 incremented:%Var1%
,自己看看。要修复脚本,需要解决在什么条件下执行什么语句

  • 使用
    setlocal
    。这只是一种很好的练习。使用
    setlocal
    可以帮助您避免使用仅与此脚本的运行时相关的变量污染外部控制台线程

  • 不要相信用户总是回答“y”或“n”。如果他们回答“w”怎么办?在编写脚本时,它将继续执行您可能不打算执行的部分。对此,我有两个建议

    a。不要明确检查“n”的答案。如果它不是“y”,则假定它是“n”。如果这不合适,则为紧跟在条件之前的任何标签设置一个最终的
    否则转到标签

    b。或者,代替<代码> SET/P<代码>,考虑使用<代码>选择< /代码>。例如:

    choice/c YN/m“是否要执行检查?”
    如果错误级别为2(
    rem//用户选择了“N”
    )否则(
    rem//用户选择了“Y”
    )
    
  • 在代码的
    :choice
    部分中,Y然后N的答案与N的答案有什么区别?如前所述,没有区别。无论哪种方式,脚本都将进入
    :检查
    。在这里检查您的逻辑

  • <> > >代替<代码>退出<代码>,考虑使用<代码>退出/b>代码>或<代码> GOTO:EOF。从cmd提示符运行脚本时(与双击相反),应避免退出父线程

  • 看在上帝的份上,缩进代码并添加一些换行符!那一大团左对齐的命令没有流动,没有节奏。阅读和排除故障很乏味

  • 之前:

    @ECHO关闭
    ::询问用户
    :选择
    set/P c=检查是否已完成[y/n]
    如果/i%c%==y(
    set/P c=是否发送剂量报告[y/n]?
    )否则(
    如果/i%c%==n转到检查
    )
    :检查
    set/P c=是否要执行检查[y/n]
    如果/i%c%==y(
    set/P c=请完成检查并单击enter
    转到文件
    )否则(
    如果/i%c%==n转到再见
    )
    
    它就像一块石板,很难一目了然地看出哪些语句是祖先,哪些语句是后代,或者在哪里出现了分段中断

    之后:

    @ECHO关闭
    setlocal
    :选择//询问用户
    选项/c YN/m“检查完成了吗?”
    如果不是错误级别2(
    选项/c YN/m“是否发送剂量报告?”
    如果错误级别为2(
    再见
    )
    )
    :检查
    选择/c YN/m“是否要执行检查?”
    如果第二级出错,再见
    设置/P“c=请完成检查并单击“输入”:
    

    看到了吗?那样读起来要愉快得多。顺便说一下,您可能已经注意到我将“询问用户”注释与
    :choice
    标签组合在一起。这通常是在定义函数来解释预期参数或只是解释发生了什么时完成的。你真的不需要双斜线。它只是让Stack Overflow的Ted Turner Technicolor解析器证明这是一条注释。

    Chris您不能在代码中加粗。从代码中删除星号。在
    :end
    附近有浮动的else命令,在
    if else
    之后有浮动的else命令,与
    else
    位于同一行。。很多可能的语法错误。。你应该检查一下,就像@Squashman说的那样,基本上从…任何地方删除*。为什么你不使用我在上一个线程中给你的相同的IF-ELSE构造和相同的代码和问题。我将删除星号,并用IF-ELSE构造更新代码。。。谢谢:)。您是否如您的问题所示,在一行中写下了
    暂停转到选项