【问题标题】:How to use set and if statements in batch files如何在批处理文件中使用 set 和 if 语句
【发布时间】:2015-11-29 04:49:04
【问题描述】:

所以我正在尝试用一些集合和 ifs 制作一个小批量程序,看起来很容易对吧?显然,你不能像这样使用“set”和“if”。

@echo off
setlocal enabledelayedexpansion
cls
set variableTrue EQU 1

然后继续代码,稍后在程序中执行此操作。

If %variableTrue% EQU 1 goto next

请注意,我也尝试过使用感叹号。 加上感叹号,就好像它完全忽略了这个陈述,即使它是真的,它也会照常继续。使用百分号,它在崩溃之前说得非常快 此时预计不会出现“1”。 或者类似的东西,就像我说的那样,它几乎没有停留半秒钟。 我一直认为只要没有冲突的变量,你就可以这样做。

:start
@echo off
setlocal enabledelayedexpansion
title test
color a
cls
:favnum
cls
echo What is your favorite number?
set /p fn=Favorite Number
If "!fn!" NEQ 13 goto thanks
If "!fn!" EQU 13 goto setvar
:setvar
set "coolestNum==1"
:thanks
cls
If "!coolestNum!"== 1 goto cool
echo Thanks
pause
goto :eof
:cool
echo cool
pause
goto :eof

这不会产生错误,它只是忽略该语句并照常进行。

更新: 修复错误后,这仍然不起作用。 当我使用感叹号时,它会忽略该行,而当我使用百分号时,它会说: "

“此时预计没有 1”

【问题讨论】:

标签: batch-file if-statement cmd set command


【解决方案1】:

一组问题是您的 IF 语句。例如,If "!coolestNum!"== 1 goto cool。引号包含在比较中。

您需要是对称的 - 两边都包含引号

If "!coolestNum!" == "1" goto cool

或者两者都不:

If !coolestNum! == 1 goto cool

If "!fn!" EQU 13 goto setvar 及其前面的行也存在同样的问题。

您遇到的另一个问题是set "coolestNum==1" 有一个多余的、不需要的=。第二个= 成为值的一部分。 IF 比较只需要两个等号。

这里是更正的代码:

:start
@echo off
setlocal enabledelayedexpansion
title test
color a
cls
:favnum
cls
echo What is your favorite number?
set /p fn=Favorite Number
If "!fn!" NEQ "13" goto thanks
If "!fn!" EQU "13" goto setvar
:setvar
set "coolestNum=1"
:thanks
set coolest
cls
If "!coolestNum!"=="1" goto cool
echo Thanks
pause
goto :eof
:cool
echo cool
pause
goto :eof

但是你的逻辑是不必要的复杂。以下产生完全相同的结果。

:start
@echo off
setlocal enabledelayedexpansion
title test
color a
cls
echo What is your favorite number?
set /p fn=Favorite Number
if !fn! equ 13 (
  set "coolestNum=1"
  echo cool
) else echo Thanks
pause
exit /b

【讨论】:

  • 感谢您的帮助,我确信这是一个问题,但它仍然无法正常工作。我不记得有这么复杂。
  • @EliR - 我发现了其他问题。查看更新的答案。
  • 感谢您的帮助,非常感谢。
【解决方案2】:

使用

set variableTrue=1

而不是

set variableTrue EQU 1

这个批处理脚本:

@echo off
setlocal enabledelayedexpansion
cls
set variableTrue=1

echo A
if %variableTrue% EQU 1 goto next
echo B
goto :EOF

:next
echo C

输出

A
C

【讨论】:

  • 它仍然给我同样的错误。是因为“set”和“if”语句相距太远吗?但是,您的代码运行良好。
  • @EliR:没有看到实际代码,我们无法判断。但是请注意,批处理通常对空格很敏感,因此set variableTrue = 1(如果这是您编码的内容)会将名为“variabletrue[space]”的变量设置为“[space]1”。if %v% equ 1...(其中 v 没有set) 将产生语法错误,因为它以if equ 1... 执行,并且“1”不是它期望作为比较器的标记之一。在这种情况下,equ 是合法字符串。要暂停批处理以查看消息,请使用pause 命令或从提示符(程序>附件>命令提示符)运行您的批处理
  • @Magoo 我编辑了原始问题以添加一个为什么它不起作用的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2017-08-01
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
相关资源
最近更新 更多