Batch file 在具有%var%的IF命令行上出现“(此时意外)”的原因是什么?

Batch file 在具有%var%的IF命令行上出现“(此时意外)”的原因是什么?,batch-file,cmd,Batch File,Cmd,当我启动下面发布的批处理文件时,我遇到了这个错误 在这个时候是出乎意料的。 如果%ad%==60,我认为这会发生在IF命令行上,但我不确定 在这个时候是出乎意料的 执行批处理文件时出现此错误消息的原因可能是什么 set ad = 60 不会将ad设置为60。它会将变量adspace设置为space60,将ad设置为脚本启动前的任何值 在您的情况下,它几乎肯定是一个空字符串,因为由此产生的命令与下面的文本中的命令相同。请注意,生成的错误: d:\pax> if ==60 ( ( was u

当我启动下面发布的批处理文件时,我遇到了这个错误 在这个时候是出乎意料的。 如果%ad%==60,我认为这会发生在IF命令行上,但我不确定

在这个时候是出乎意料的

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

set ad = 60
不会将ad设置为60。它会将变量adspace设置为space60,将ad设置为脚本启动前的任何值

在您的情况下,它几乎肯定是一个空字符串,因为由此产生的命令与下面的文本中的命令相同。请注意,生成的错误:

d:\pax> if ==60 (
( was unexpected at this time.
如果您希望表达式之间有很好的间隔,那么您已经知道如何做到这一点,因为您使用它来增加h。换句话说:

set /a "ad = 0"
首先,

set ad = 60
不会将ad设置为60。它会将变量adspace设置为space60,将ad设置为脚本启动前的任何值

在您的情况下,它几乎肯定是一个空字符串,因为由此产生的命令与下面的文本中的命令相同。请注意,生成的错误:

d:\pax> if ==60 (
( was unexpected at this time.
如果您希望表达式之间有很好的间隔,那么您已经知道如何做到这一点,因为您使用它来增加h。换句话说:

set /a "ad = 0"

从技术上讲,这并不是一个已经充分提供的答案。这只是一个示例,向您展示了如何选择将脚本缩短一点:

@回音 颜色0F 头衔 模式50,25 设置/A ad=s=m=h=d=0 如果不存在start.txt退出/B Del start.txt :1 如果%ad%Equ 60 这里有什么吗 设置ad=0 Rem分钟 如果%s%eq 60套/A m+=1,s-=60 Rem小时 如果%m%Equ 60套/A h+=1,m-=60 快速眼动天数 如果%h%eq 24集/A d+=1,则h-=24 ClS 在这里回音。。。 超时1>Nul 设置/A ad+=1,s+=1 后藤:1
注意:1.使用超时1不会以精确的秒为单位递增时钟,它大约是1秒加上再次运行:1所需的时间。2.小心不要落入Set/A的八进制陷阱,确保变量中没有前导0。

这在技术上不是一个答案,已经得到了充分的验证提供。这只是一个示例,向您展示如何选择将脚本缩短一点:

@回音 颜色0F 头衔 模式50,25 设置/A ad=s=m=h=d=0 如果不存在start.txt退出/B Del start.txt :1 如果%ad%Equ 60 这里有什么吗 设置ad=0 Rem分钟 如果%s%eq 60套/A m+=1,s-=60 Rem小时 如果%m%Equ 60套/A h+=1,m-=60 快速眼动天数 如果%h%eq 24集/A d+=1,则h-=24 ClS 在这里回音。。。 超时1>Nul 设置/A ad+=1,s+=1 后藤:1
注意:1.使用超时1不会以精确的秒为单位递增时钟,它大约是1秒加上再次运行:1所需的时间。2.小心不要落入Set/A的八进制陷阱,方法是确保变量中没有前导0。

我有不带空格的IF命令,也有使用中的命令批处理quotes;still Get此时出现意外错误。从命令行调用批处理文件时。如果从资源管理器启动,批处理文件将崩溃

以下是崩溃代码:

if %file%==local (
    set miss=n
    set /p miss=Any missing?
    set miss=%miss:~0,1%

    if /I %miss%==y (
    Goto check2
    ) 
)
当我回显IF语句之前的miss值时,得到%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
    ) 
)

我使用了不带空格的IF命令,也使用引号中的命令进行批处理;此时仍然出现意外错误。从命令行调用批处理文件时。如果从资源管理器启动,批处理文件将崩溃

以下是崩溃代码:

if %file%==local (
    set miss=n
    set /p miss=Any missing?
    set miss=%miss:~0,1%

    if /I %miss%==y (
    Goto check2
    ) 
)
当我回显IF语句之前的miss值时,得到%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
    ) 
)

从所有set var=value表达式中删除空格。示例set ad=0=>set ad=0。否则ad为空,但变量ad设置为0@Kake请阅读和上的答案。您可以通过在CMD提示符下以交互方式运行脚本并注释掉@echo off line来调试此类错误。这样您将成为当已应用%扩展时,您可以按原样查看命令,这将使您能够亲自查看问题。即使在您观察时问题并不明显,但至少可以查看产生问题的特定命令,这将对您有所帮助。请从所有集合v中删除空格ar=值表达式。示例set ad=0=>set ad=0。否则ad为空,但变量ad设置为0@Kake请阅读和上的答案。您可以通过在注释掉@echo off line的CMD提示符下以交互方式运行脚本来调试此类错误。这样,您就可以看到命令的原样当%扩展已经应用时,这将使您能够亲自看到问题。即使
当你观察到这个问题时,问题并不是很明显,至少可以通过查看产生问题的特定命令来帮助你。答案的最后部分有点误导,因为set/a的行为与set不同。set/a会自动删除所有空格,它与引号无关。jeb/Mofi,我不确定您在最后一段中认为有什么误导性。它提供了一种很好地设置表达式的方法,以便变量=、和值不必相邻。如果这样做有问题,请告诉我。您的答案的最后部分有点误导,因为set/a的行为与set不同。set/a会自动删除所有空格,它与引号无关。jeb/Mofi,我不确定您在最后一段中认为有什么误导性。它提供了一种很好地设置表达式的方法,以便变量=、和值不必相邻。如果这样做有错误,请告诉我。只有当您访问在同一命令块中定义/更改的变量时,才需要延迟扩展。括号中包含一系列命令。您的第一个代码段运行正常,除非它位于未显示的周围命令块中。啊,是的,此代码位于If的代码块中,因此仅在启用DelayedExpansion时才起作用。可能会帮助那些忽略了它,并且犯了同样的错误的人你可能想把它包括在你的答案中,或者显示整个代码块,因为就目前的情况而言,您的答案是错误的,或者至少是误导性的。只有当您访问同一命令块中定义/更改的变量时,才需要延迟扩展。该命令块包含一系列括号内的命令。您的第一个代码段运行正常,除非它位于未显示的周围命令块中。啊,是的,此代码位于If的代码块中,因此仅在启用DelayedExpansion时才起作用。可能会帮助那些忽略了它并犯了同样错误的人。您可能希望将其包含在您的答案中,或者显示整个代码块,因为就目前情况而言,您的答案是错误的,或者至少是误导性的。