我如何在批处理中将数字变量前加0

问题描述 投票:1回答:3

我似乎无法在任何地方找到答案,即使是这样的“基本”事情,我也认为别人已经做过。

无论如何,这里什么也没做。

我制作了一个简单的批处理脚本作为计时器(递增计数)及其dd:hh:mm:ss格式,但仅显示必要内容。例如,如果天和小时= 0,则只有mm:ss等。

现在我从0-9开始遇到了一个小问题...

我想说00-01-02-03-04-05 ...,但现在它在说0-1-2-3-4-5 ...

可以说我把时间放在一个循环中,延迟1秒总是加一秒。因为要处理数字,所以我做了一个数字/a变量。但我似乎无法弄清楚如果数字小于10则如何在数字前添加0 ...

到目前为止,我已经尝试了以下方法:

echo %s:""=0%

没关系,我在输入时想出了解决方案...请参阅我的答案

batch-file timer decimal clock digits
3个回答
0
投票

这实际上比看起来容易得多。

将任何简单(非32位溢出)数字转换为前导0的数字:

只需从前面有一个的值中减去前面有2的值减去前面有1的值。

即1 [您的值]-(2 [您的值]-1 [您的值]]

要转换为前导0:

确定所需的前导0将数字设置为0加上当前值,然后选择最后N个字符,这意味着您希望拥有N个数字。

即对于两位数总填充为00,然后为当前值,并选择最后两位数。

这里使用我的时间函数和一些简单的函数可以根据需要轻松转换这些值,这更容易演示:

@(SETLOCAL EnableDelayedExpansion
  ECHO OFF
  CALL :Get-DateTime
)

CALL :Main

( ENDLOCAL
  EXIT /B
)

:Main
  ECHO.Initial Values:                        HH = "%HH%"  -- MN = "%MN%"  -- SS = "%SS%"
  CALL :Convert_To_Leading_Zero HH
  CALL :Convert_To_Leading_Zero MN %MN%
  CALL :Convert_To_Leading_Zero SS %SS%
  ECHO.After Convert_To_Leading_Zero Values:  HH = "%HH%"  -- MN = "%MN%"  -- SS = "%SS%"
  CALL :Convert_To_Number HH
  CALL :Convert_To_Number MN %MN%
  CALL :Convert_To_Number SS %SS%
  ECHO.Convert_To_Number:                     HH = "%HH%"  -- MN = "%MN%"  -- SS = "%SS%"
  CALL :Convert_To_Leading_Zero HH
  CALL :Convert_To_Leading_Zero MN %MN%
  CALL :Convert_To_Leading_Zero SS
  ECHO.After Convert_To_Leading_Zero Values:  HH = "%HH%"  -- MN = "%MN%"  -- SS = "%SS%"

GOTO :EOF

:Convert_To_Leading_Zero
  REM %1 -- Variable to Return
  REM %2 -- Value to Convert IF EMpty Will try to use !%1! instead!
  IF /I "%~2" NEQ "" (
    SET "%~1=0%~2"
    SET "%~1=!%~1:~-2,2!
  ) ELSE (
    IF NOT DEFINED %~1 (
      ECHO. Looks like you need to review your code.) ELSE (
      SET "%~1=0!%~1!"
      SET "%~1=!%~1:~-2,2!
    )
  )
GOTO :EOF

:Convert_To_Number
  REM %1 -- Variable to Return
  REM %2 -- Value to Convert IF EMpty Will try to use !%1! instead!
  IF /I "%~2" NEQ "" (
    SET /A "%~1=1%~2 - (2%~2 - 1%~2)"
  ) ELSE (
    IF NOT DEFINED %~1 (
      ECHO. Looks like you need to review your code.) ELSE (
      SET /A "%~1=1!%~1! - (2!%~1! - 1!%~1!)"
    )
  )
GOTO :EOF

:Get-DateTime
    FOR /F "Tokens=1-7 delims=MTWFSmtwfsouehrandit:-\/. " %%A IN ("%DATE% %TIME: =0%") DO (
        FOR /F "Tokens=2-4 Skip=1 Delims=(-)" %%a IN ('ECHO.^| DATE') DO (
            SET "%%~a=%%~A"
            SET "%%~b=%%~B"
            SET "%%~c=%%~C"
            SET /a "#%%~a=1%%~A - (2%%~A-1%%~A)"
            SET /a "#%%~b=1%%~B - (2%%~B-1%%~B)"
            SET /a "#%%~c=1%%~C - (2%%~C-1%%~C)"
            SET "HH=%%~D"
            SET "Mn=%%~E"
            SET "SS=%%~F"
            SET "Ms=%%~G"
            SET /a "#HH=1%%~D - (2%%~D-1%%~D)"
            SET /a "#Mn=1%%~E - (2%%~E-1%%~E)"
            SET /a "#SS=1%%~F - (2%%~F-1%%~F)"
            SET /a "#Ms=1%%~G - (2%%~G-1%%~G)"
            SET /a "#TMinutes=((1%%~D - (2%%~D-1%%~D))*60)+(1%%~E - (2%%~E-1%%~E))"
            SET /a "#TSeconds=((((1%%~D - (2%%~D-1%%~D))*60)+(1%%~E - (2%%~E-1%%~E)))*60)+(1%%~F - (2%%~F-1%%~F))"
        )
    )
    SET "TTime=%HH%.%Mn%.%SS%"
    SET "IsoTime=%HH%.%Mn%.%SS%.%Ms%"
    SET "TDate=%yy%-%mm%-%dd%"
    SET "IsoDate=%yy%-%mm%-%dd%"
    SET "IsoDateTime=%yy%-%mm%-%dd%_%HH%.%Mn%.%SS%.%Ms%"
GOTO :EOF

这将导致以下结果:

C:\Users\Administrator>C:\Admin\S-O_Convert_Numbers.cmd
Initial Values:                        HH = "01"  -- MN = "06"  -- SS = "47"
After Convert_To_Leading_Zero Values:  HH = "01"  -- MN = "06"  -- SS = "47"
Convert_To_Number:                     HH = "1"  -- MN = "6"  -- SS = "47"
After Convert_To_Leading_Zero Values:  HH = "01"  -- MN = "06"  -- SS = "47"

C:\Users\Administrator>C:\Admin\S-O_Convert_Numbers.cmd
Initial Values:                        HH = "01"  -- MN = "08"  -- SS = "05"
After Convert_To_Leading_Zero Values:  HH = "01"  -- MN = "08"  -- SS = "05"
Convert_To_Number:                     HH = "1"  -- MN = "8"  -- SS = "5"
After Convert_To_Leading_Zero Values:  HH = "01"  -- MN = "08"  -- SS = "05"

C:\Users\Administrator>C:\Admin\S-O_Convert_Numbers.cmd
Initial Values:                        HH = "01"  -- MN = "08"  -- SS = "12"
After Convert_To_Leading_Zero Values:  HH = "01"  -- MN = "08"  -- SS = "12"
Convert_To_Number:                     HH = "1"  -- MN = "8"  -- SS = "12"
After Convert_To_Leading_Zero Values:  HH = "01"  -- MN = "08"  -- SS = "12"

0
投票

更新:

这是我的最终代码,它之所以有效,是因为如果有空间,我只会在任何时候都应用填充。对一个简单问题的简单解决方案。

你们都想得太多了,尤其是您@Ben Personick(Geez)

这是我的代码,如果您想撕它。

@echo off
title Stream counter
color a
cd /d "%~dp0"
set /a x=3
set nl=^&echo.
goto :top
:retry
cls
if %x% LEQ 0 (
    exit()
    ) else (
    title OOPS!
    echo Oops! You either didn't press anything or waited too long,
    echo if you're still there you can try again in a few seconds.
    ping 127.0.0.1 -n 10 >nul
    )
:top
title Stream counter
cls
echo Attemps left^: %x%
echo Start counter from zero? (y/n)
choice /n /c YNC /t 10 /d C>nul
if %errorlevel%==1 (
    goto :yes
    ) else if %errorlevel%==2 (
    goto :no
        ) else if %errorlevel%==3 (
        set /a x-=1
        goto :retry
        )
:yes
cls
set /a d=0
set /a h=0
set /a m=0
set /a s=0
goto :start
:no
cls
echo where do you want your timer to start?
echo Start by entering day^(s^)
set /p d=""
echo Now enter hour^(s^)
set /p h=""
echo Then enter minute^(s^)
set /p m=""
echo And finally second^(s^)
set /p s=""

goto :start
:start
rem delete this if you want to keep the result (it will get overwritten anyways...)
del final.txt
rem Use the choice to ask if you want to continue, and use that as a "Press any key to stop", kind of thing.
:startloop
::Check point "seconds"
:cps
if %s% geq 60 (
set /a s-=60
set /a m+=1
goto :startloop
)
::Check point "minutes"
:cpm
if %m% geq 60 (
set /a m-=60
set /a h+=1
goto :startloop
)
::Check point "hours"
:cph
if %h% geq 24 (
set /a h-=24
set /a d+=1
goto :startloop
) else (
goto :mainloop
)
:mainloop
cls
set ps=00%s%
set pm=00%m%
set ph=00%h%
set ps=%ps:~-2%
set pm=%pm:~-2%
set ph=%ph:~-2%
if %d% geq 1 (
    if %h% geq 1 set "output=%d% day^(s^) %ph%^:%pm%^:%ps%"
    if %h% equ 0 set "output=%d% day^(s^) %pm%^:%ps%"
) else if %h% geq 1 (
    set "output=%ph%^:%pm%^:%ps%"
) else (
    set "output=%pm%^:%ps%"
)
echo %output% > counter.txt
echo Current time^: %output% &echo.
echo Do you wish to abort? (Y/N)
choice /n /c yn /t 1 /d n >nul
if %errorlevel%==1 goto :end
set /a s+=1
::Check point "seconds"
:cps
if %s% geq 60 (
set /a s-=60
set /a m+=1
)
::Check point "minutes"
:cpm
if %m% geq 60 (
set /a m-=60
set /a h+=1
)
::Check point "hours"
:cph
if %h% geq 24 (
set /a h-=24
set /a d+=1
)
goto :mainloop
:end
:: END ::
rem COPY TO RESULT.txt and del counter.txt
copy /V counter.txt final.txt & del counter.txt
exit()

-3
投票

等等,我很沮丧。

解决方案是这->set s=0%s%然后将其转换回数值... set /a s+=0该死...

© www.soinside.com 2019 - 2024. All rights reserved.