上午 9 点之前 运行 时的 Bat 文件给出错误,无效数字。数字常量是十进制 (17),

Bat file when ran prior to 9 AM gives the error,Invalid number. Numeric constants are either decimal (17),

我有一个 bat 文件,用于检查 23:00 时间和 23:00 之后要执行的一些进一步步骤的启动。

稍后启动到 10:00 AM 的批次确实有效。 但是当 运行 在 09:00 AM 时相同的 bat 不起作用并抛出如下错误:

Invalid number.  Numeric constants are either decimal (17),
hexadecimal (0x11), or octal (021).

我观察到这个 bat 文件只工作了两位数的小时,而不是个位数的小时,例如 1,2,3,4,5,6,7,8,9

代码:

@For /F "tokens=1,2,3,4 delims=/-: " %%A in ('time /t') do @(
Set Hour=%%A
Set Minute=%%B
)
echo current hour is %Hour%
echo current Minute is %Minute%

set /A remaining_hour=23-%Hour%
set /A remaining_minutes=60-%Minute%

echo Remaining hours to reach 23:00 is %remaining_hour%
echo Remaining Minutes to reach 23:00 is %remaining_minutes%

你能帮我去掉错误信息吗?

根据建议修改了下面的代码,当我尝试将我的系统时间更改为 09:00 AM

来测试 bat 文件时仍然不起作用

修改后的代码1:

@echo off
@For /F "tokens=1,2,3,4 delims=/-: " %%A in ('time /t') do @(
Set Hour=%%A
for /F "tokens=* delims=0" %%N in ("%Hour%") do set "Hour=%%N" & set /A "Hour+=0"
Set Minute=%%B
)
setlocal EnableDelayedExpansion
echo current hour is %Hour%
echo current Minute is %Minute%

set /A remaining_hour=23-%Hour%
set /A remaining_minutes=60-%Minute%

echo Remaining hours to reach 23:00 is %remaining_hour%
echo Remaining Minutes to reach 23:00 is %remaining_minutes%

set /A sleep_Minutes=((remaining_minutes+(60*remaining_hour))*60)

echo Total sleep time is %sleep_Minutes%
pause

set /A 命令将前面带有零的数字解释为八进制数字 -- 参见 set /?:

Numeric values are decimal numbers, unless prefixed by 0x for hexadecimal numbers, and 0 for octal numbers. So 0x12 is the same as 18 is the same as 022. Please note that the octal notation can be confusing: 08 and 09 are not valid numbers because 8 and 9 are not valid octal digits.

您可以通过删除 Hour 值中的前导零轻松解决此问题:

for /F "tokens=* delims=0" %%N in ("%Hour%") do set "Hour=%%N" & set /A "Hour+=0"
for /F "tokens=* delims=0" %%N in ("%Minute%") do set "Minute=%%N" & set /A "Minute+=0"

这是实现上述内容的完整代码:

@for /F "tokens=1,2,3,4 delims=/-: " %%A in ("%TIME%") do @(
    for /F "tokens=* delims=0" %%N in ("%%A") do set "Hour=%%N" & set /A "Hour+=0"
    for /F "tokens=* delims=0" %%N in ("%%B") do set "Minute=%%N" & set /A "Minute+=0"
)
echo current hour is %Hour%
echo current Minute is %Minute%

set /A remaining_hour=23-Hour
set /A remaining_minutes=60-Minute

echo Remaining hours to reach 23:00 is %remaining_hour%
echo Remaining Minutes to reach 23:00 is %remaining_minutes%