在具有%var%的IF命令行上“(此时出乎意料。”)的原因是什么?

时间:2017-12-19 23:24:40

标签: batch-file cmd

当我启动下面发布的批处理文件时,我收到此错误 (此时出乎意料。
我认为这发生在 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

执行批处理文件时出现此错误消息的原因是什么?

3 个答案:

答案 0 :(得分:4)

首先,

set ad = 60

ad设置为60。它会将变量adspace设置为space60,将ad保留为脚本开始之前的任何内容。

在你的情况下,它几乎肯定是一个空字符串,因为由此产生的命令将与下面的记录中的命令相同(注意生成的错误):

d:\pax> if ==60 (
( was unexpected at this time.

如果你想要间隔很好的表达式,你已经知道如何做到这一点,因为你用它来增加h。换句话说:

set /a "ad = 0"

答案 1 :(得分: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

答案 2 :(得分:0)

我有没有空格的IF命令,并且还用引号将命令批处理了;从命令行调用批处理文件时,仍然出现错误verbose =
如果从资源管理器启动,则批处理文件崩溃了。

以下是崩溃代码:

( was unexpected at this time.

当我在IF语句之前if %file%==local ( set miss=n set /p miss=Any missing? set miss=%miss:~0,1% if /I %miss%==y ( Goto check2 ) ) 的值echo时,我得到miss

要解决此问题,我启用了延迟扩展,以强制在运行时更新值,并且现在可以正常工作。

%miss:~0,1%