在带有 %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
    ) 
)

当我echomiss在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 命令行上出现“(此时意外。”的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 node.js 在命令行上运行 DOH

在命令行上使用带有jupyter nbconvert v5.3.1的自定义预处理器

避免在 PL/SQL 命令行上的选择结果之间出现空行

在命令行上获取用户输入。

函数内部 sed 命令中的 bash 语法错误,在命令行上工作正常

在 windows 的命令行上创建一个空文件(如 linux touch 命令)