为了账号安全,请及时绑定邮箱和手机立即绑定

变量与常量的批处理文件比较失败

/ 猿问

变量与常量的批处理文件比较失败

一只甜甜圈 2019-07-16 10:48:40

变量与常量的批处理文件比较失败

我想写一段简单的代码,得到一些很好的格式“时间戳”。让时间进入我的两个变量StartEnd效果很好。我也可以把它打印成0:0:0。如果它小于10,我想要一个前导零,但是很明显,我收到了一个错误,它说‘没有找到参数10,或者输入错了’。我发现这似乎是要比较的变量,但我没能解决这个问题。有什么想法吗?

@ECHO OFF
REM Time Calculation
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Second /Format:table ^| findstr /r "."') DO (
 set Day=%%A
 set Hour=%%B
 set Minute=%%C
 set Second=%%D
)
set /a Start=%Day%*8640000+%Hour%*360000+%Minute%*6000+%Second%*100
@ECHO ON
ping 8.8.8.8 -n 11
@ECHO OFF
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Second /Format:table ^| findstr /r "."') DO (
 set Day=%%A
 set Hour=%%B
 set Minute=%%C
 set Second=%%D
)
set /a End=%Day%*8640000+%Hour%*360000+%Minute%*6000+%Second%*100
set /a Diff=%End%-%Start%
set /a Diff=(%Diff%)/100
set /a DiffSec=%Diff%%%60
set /a Diff=(%Diff%-%Diff%%%60)/60
set /a DiffMin=%Diff%%%60
set /a Diff=(%Diff%-%Diff%%%60)/60
set /a DiffHrs=%Diff%

ECHO Laufzeit Auftraege loeschen: %DiffHrs%:%DiffMin%:%DiffSec%

:: format with leading zeroes
if %DiffSec% LSS 10 (ECHO "LESS 10")else %DiffSec% LSS 1 (ECHO "LESS 1")
::if %DiffSec% LSS 10 (set DiffSec=0%DiffSec%)else [%DiffSec%] LSS 1 (set DiffSec=00)
::if %DiffMin% LSS 10 (set DiffMin=0%DiffMin%)else [%DiffMin%] LSS 1 (set DiffMin=00)
::if %DiffHrs% LSS 10 (set DiffHrs=0%DiffHrs%)else [%DiffHrs%] LSS 1 (set DiffHrs=00)

ECHO Laufzeit Auftraege loeschen: %DiffHrs%:%DiffMin%:%DiffSec%


查看完整描述

3 回答

?
HUWWW

1.调试批处理文件

为了调试批处理文件以查找代码中的语法错误,建议在每个命令提示符窗口中分别运行该批处理文件。echo off修改为echo ON或从批处理文件中删除或使用命令注释掉。REM.

默认情况下,Windows命令解释器输出每个命令行或从(以匹配结束)对哪些环境变量进行了分析和预处理之后,%variable%(立即展开)在执行命令行/块之前,已经被环境变量的当前值所取代。

带着@echo off在批处理文件的顶部,此默认行为将被关闭,从而@在命令行开始时,也禁用该第一个命令行的输出。当然,当批处理文件的开发完成并且批处理文件工作良好时,这是值得欢迎的。但是,对于调试未按预期工作的批处理文件,最好也查看命令解释器真正执行的命令行,以找出批处理文件执行因错误而意外退出的位置。

这个回波在运行时的帮助输出中对行为进行了非常简短的解释。echo /?在命令提示符窗口中。

打开命令提示符窗口将导致启动cmd.exe隐式期权/K守住命令进程运行和控制台窗口打开后,执行批处理文件或应用程序完成。

当批处理文件包含以下命令时出现异常exit无参数/B因为在这种情况下,当前命令进程总是独立于调用层次结构而退出。exit /B相等goto :EOF并且应该被使用而不是仅仅exit但是有一个很好的理由exitexit /Bgoto :EOF默认情况下,需要在Windows上启用这两个命令扩展名。

双击批处理文件将导致启动cmd.exe有选项/C当应用程序或批处理文件的执行完成时,命令进程及其控制台窗口将自动完成,这取决于批处理文件的执行为什么终止。这种自动关闭控制台窗口的行为不利于调试批处理文件,因为当批处理文件执行由于语法错误而终止时,无法看到错误消息。

有关Windows命令解释器选项的详细信息,请在命令提示符窗口中运行该命令:cmd /?

如何在执行批处理文件时故意退出goto :EOF(冒号在这里通过异常很重要)或exit /B(只是内部别名goto :EOF)在通过运行显示的这两个命令的帮助下进行解释。goto /?exit /?在命令提示符窗口中。

对于调试更大的批处理文件,使用临时添加的goto在批处理文件的顶部跳转到某个块和goto :EOF若要在要调试的块之后退出批处理,请执行以下操作。

顺便问一下:::是一个无效的标签,通常用于批次文件中的注释,因为在执行批处理文件时,标签行永远不会显示。但是在循环标签无法使用,因为Windows命令解释器无法正确解释循环命令块中的标签。因此,最好使用命令。REM(注意)对于注释,因为此命令是为批处理文件中的注释而设计的,并且实际上在批处理文件中的任何地方工作。

2.批处理文件中的错误

如何运行有问题的批处理文件@ECHO OFF将其替换为rem @echo off(在文本编辑器中运行替换)从命令提示符窗口中可以很容易地看到错误发生在哪一行:

if %DiffSec% LSS 10 (ECHO "LESS 10")else %DiffSec% LSS 1 (ECHO "LESS 1")

环境变量的当前值DiffSec不低于10然后其他分支由Windows命令解释器执行,该解释器以数字开头,如10.

Windows命令解释器无法在当前目录或以分号分隔的环境变量目录列表中指定的任何目录中找到具有该名称的应用程序。PATH具有在分号分隔的环境变量的文件扩展名列表中指定的文件扩展名。PATHEXT.

错误就在这里,显然是失踪的人如果命令进行下一次比较。所以正确的代码是

if %DiffSec% LSS 10 (ECHO "LESS 10") else if %DiffSec% LSS 1 ECHO "LESS 1"

如果在多行上写入条件,这将更容易理解:

if %DiffSec% LSS 10 (
    ECHO "LESS 10"
) else if %DiffSec% LSS 1 (
    ECHO "LESS 1"
)

语法现在是正确的。

但是第二个条件没有意义,因为约瑟夫在他的评论中已经提到了。如果值为DiffSec是10或更大,从而导致执行如果指挥其他分支,这个条件也绝对不是真的。所以更有意义的是:

if %DiffSec% LSS 1 (ECHO LESS 1) else if %DiffSec% LSS 10 ECHO LESS 10

或者另一种选择

if %DiffSec% LSS 1 (
    ECHO LESS 1
) else if %DiffSec% LSS 10 (
    ECHO LESS 10
)

有关有效信息的更多信息。如果不是批处理文件中的条件例如见

3.将数字<10的前导零相加

环境变量总是字符串类型。对于算术表达式,环境变量的字符串值在可能的情况下被转换为带符号的32位整数,并将算术表达式的结果从带符号的32位整数转换回字符串。

也是如果条件类似if %DiffSec% LSS 10在执行之前展开,例如if 5 LSS 10转换结果5(0x35)从字符串到整数和10(0x31 0x30)也从字符串到整数,用于将这两个数字作为整数进行比较。

因此,如果可能的话,避免这样的数字比较会更快一些。

如果不使用字符串替换对值进行真正的测试,就很容易将前导零添加到小于10的数字中。

首先,环境变量的当前值以1(对于两位数)或更多的值加在前面。0(用于3、4或更多位数)。

set "DiffSec=0%DiffSec%"

下一个最活的,刚过去的从环境变量的当前值到环境变量的当前值,像2这样的X字符被分配给环境变量。

set "DiffSec=%DiffSec:~-2%"

字符串替换是在命令的帮助下解释的。通过在命令提示符窗口中运行输出set /?.

这两条线的结果是DiffSec有价值099在这两行之后,始终是范围内的两位数。0099.

4.算术表达式的解析

一个算术表达式,它是后面的字符串。set /a由Windows命令解释器解释,与其他字符串完全不同。

空格和制表符是分隔词,但没有进一步的特殊意义。因此,建议使用空格使算术表达式更好地可读性。

然后,有大量的操作符,它们都是在命令的帮助下列出的。在命令提示符窗口中运行时显示set /?.

此外,十进制、八进制和十六进制整数在算术表达式中被解释为整数。

最后,每一个其他字符串都被解释为其环境变量的名称。电流值从字符串转换为整数。

因此,在算术表达式中使用立即展开或延迟展开是不可取的。

引用环境变量的值%variable%在执行第一个命令之前,在环境变量的当前值替换已在解析整个命令块时的变量引用的命令块中使用算术表达式是不好的。

引用环境变量的值!variable!在算术表达式中也不是很好,因为它需要启用延迟扩展,这将导致字符串中的感叹号不再作为文字字符处理。

因此,最好的方法是在算术表达式中只编写变量名,而不使用周围的百分比符号或感叹号,如果这是可能的,因为变量名称不包含空格字符,并且以一个不能被Windows命令解释器解释为整数字符的字符开头。

亦见有关的答覆。为什么在命令行上使用‘set var=text’之后没有带有‘echo%var%’的字符串输出?有关如何将值赋值给环境变量的详细信息,请使用setset /P(迅速)或set /A(算术表达式)。

5.固定和优化代码

所讨论的代码可以根据以下代码进行修正和优化:

@echo off
rem Time Calculation
for /F "skip=1 tokens=1-4" %%A in ('%SystemRoot%\System32\wbem\wmic.exe PATH Win32_LocalTime GET Day^,Hour^,Minute^,Second') do (
    set Day=%%A
    set Hour=%%B
    set Minute=%%C
    set Second=%%D
)
set /A TimeStart=Day * 86400 + Hour * 3600 + Minute *60 + Second

@echo on
%SystemRoot%\System32\ping.exe 8.8.8.8 -n 11
@echo off

for /F "skip=1 tokens=1-4" %%A in ('%SystemRoot%\System32\wbem\wmic.exe PATH Win32_LocalTime GET Day^,Hour^,Minute^,Second') do (
    set Day=%%A
    set Hour=%%B
    set Minute=%%C
    set Second=%%D
)
set /A TimeEnd=Day * 86400 + Hour * 3600 + Minute *60 + Second

set /A TimeDiff=TimeEnd - TimeStart
set /A DiffSec=TimeDiff %% 60
set /A TimeDiff=(TimeDiff - DiffSec) / 60
set /A DiffMin= TimeDiff %% 60
set /A DiffHrs=(TimeDiff - DiffMin) / 60

set "DiffSec=0%DiffSec%"
set "DiffSec=%DiffSec:~-2%"
set "DiffMin=0%DiffMin%"
set "DiffMin=%DiffMin:~-2%"
set "DiffHrs=0%DiffHrs%"
set "DiffHrs=%DiffHrs:~-2%"

echo Time needed for orders deletion: %DiffHrs%:%DiffMin%:%DiffSec%

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在那里执行以下命令,并非常仔细地读取为每个命令显示的所有帮助页。

  • echo /?

  • for /?

  • ping /?

  • rem /?

  • set /?

  • wmic /?

  • wmic path /?


查看完整回答
反对 回复 2019-07-16
?
守着星空守着你
if %DiffSec% LSS 10 (ECHO "LESS 10")else IF %DiffSec% LSS 1 (ECHO "LESS 1")

你需要一个if在.之后else.


查看完整回答
反对 回复 2019-07-16
?
喵喔喔

    if %DiffSec% LSS 1 (ECHO "LESS 1") else IF %DiffSec% LSS 10 (ECHO "LESS 10")..否则,else任何小于1的东西都不会生效。


查看完整回答
反对 回复 2019-07-16

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信