在带有 %var% 的 IF 命令行上出现“(此时意外。”的原因是啥?
Posted
技术标签:
【中文标题】在带有 %var% 的 IF 命令行上出现“(此时意外。”的原因是啥?【英文标题】:What is the reason for "( was unexpected at this time." on an IF command line with %var%?在带有 %var% 的 IF 命令行上出现“(此时意外。”的原因是什么? 【发布时间】:2018-06-02 11:04:15 【问题描述】:当我启动下面发布的批处理文件时,我收到了这个错误
(此时出乎意料。
我认为这发生在 IF 命令行 if %ad%==60 (
但我不确定。
(此时出乎意料。
@echo off
color 0f
title TITLE
mode con cols=50 lines=25
set ad = 0
set s = 0
set m = 0
set h = 0
set d = 0
if exist start.txt (
del start.txt
goto :1
) else (
exit
)
:1
if %ad%==60 (
:: Something here
set ad = 0
)
:: MINUTES
if %s%==60 (
set /a m=m+1
set s = 0
)
:: HOURS
if %m%==60 (
set /a h=h+1
set m = 0
)
:: DAYS
if %h%==24 (
set /a d=d+1
set h = 0
)
cls
echo Something here...
timeout 1 > nul
set /a ad=ad+1
set /a s=s+1
goto :1
执行批处理文件时出现此错误消息的原因可能是什么?
【问题讨论】:
删除所有set var<space>=<space>value
表达式中的空格。例如set ad = 0
=> set ad=0
。否则ad
为空,但变量ad<space>
设置为<space>0
@Kake 请阅读Why is no string output with 'echo %var%' after using 'set var = text' on command line? 和Symbol equivalent to NEQ, LSS, GTR, etc. in Windows batch files 上的答案。
Why is no string output with 'echo %var%' after using 'set var = text' on command line?的可能重复
您可以通过交互式运行脚本(从 CMD 提示符)调试此类错误,并注释掉 @echo off
行。这样,当 % 扩展已经应用时,您将能够看到您的命令,这反过来又可以让您自己看到问题。即使问题在您观察时不是很明显,但至少可以通过查看产生问题的特定命令来帮助您。
【参考方案1】:
首先,
set ad = 60
不会将ad
设置为60
。它将变量ad<kbd>space</kbd>
设置为<kbd>space</kbd>60
,将ad
保留为脚本开始之前的任何值。
在您的情况下,它几乎肯定是一个空字符串,因为由此产生的命令将与以下脚本中的命令相同(注意生成的错误):
d:\pax> if ==60 (
( was unexpected at this time.
如果您想要很好地分隔表达式,您已经知道如何做到这一点,因为您使用它来增加h
。换句话说:
set /a "ad = 0"
【讨论】:
您答案的最后一部分有点误导,因为set /a
的行为与set
不同。 set /a
将自己删除所有空格,与引号无关。
jeb/Mofi,我不确定您认为最后一段中的误导性内容。它提供了一种很好地设置表达式的方法,以便变量=
和值不必邻接。如果这样做有错误,请告诉我。【参考方案2】:
这在技术上不是一个答案,(已经充分提供)。这只是一个示例,向您展示如何选择性地缩短脚本:
@Echo Off
Color 0F
Title TITLE
Mode 50,25
Set /A ad=s=m=h=d=0
If Not Exist "start.txt" Exit /B
Del "start.txt"
:1
If %ad% Equ 60 (
Rem Something here
Set "ad=0"
)
Rem Minutes
If %s% Equ 60 Set /A m+=1,s-=60
Rem Hours
If %m% Equ 60 Set /A h+=1,m-=60
Rem Days
If %h% Equ 24 Set /A d+=1,h-=24
ClS
Echo Something here...
Timeout 1 >Nul
Set /A ad+=1,s+=1
GoTo :1
注意: 1. 使用Timeout 1
不会像时钟一样递增(以精确的秒为单位),它大约是一秒加上再次运行:1
所花费的时间。 2.请注意不要落入Set /A
的八进制陷阱,请确保您的变量中没有前导0
。
【讨论】:
【参考方案3】:我有没有空格的 IF 命令,并且还使用引号中的命令进行批处理;从命令行调用批处理文件时仍然出现错误( was unexpected at this time.
。 如果从资源管理器启动,批处理文件会崩溃。
这是崩溃代码:
if %file%==local (
set miss=n
set /p miss=Any missing?
set miss=%miss:~0,1%
if /I %miss%==y (
Goto check2
)
)
当我echo
miss
在IF语句前的值时,我得到%miss:~0,1%
为了解决这个问题,我启用了延迟扩展,强制在运行时更新值,现在可以正常工作了。
if %file%==local (
set miss=n
set /p miss=Any missing?
set miss=!miss:~0,1!
if /I !miss!==y (
Goto check2
)
)
【讨论】:
仅当您访问在同一命令块中定义/更改的变量(括号中包含的一系列命令)时才需要延迟扩展。你的第一个 sn-p 运行良好,除非它在你没有显示的周围命令块内。 啊,是的,这段代码在If
的代码块中,所以只有在DelayedExpansion
启用时才有效。可能会帮助忽略它并遇到相同错误的人
您可能希望将其包含在您的答案中(或显示整个代码块),因为就目前而言,您的答案是错误的或至少具有误导性。以上是关于在带有 %var% 的 IF 命令行上出现“(此时意外。”的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在命令行上使用带有jupyter nbconvert v5.3.1的自定义预处理器