Как я могу добавить 0 перед числовой переменной в пакете - PullRequest
0 голосов
/ 02 ноября 2019

Кажется, я нигде не могу найти ответ, даже если это такая "базовая" вещь, я бы предположил, что кто-то другой уже сделал это.

В любом случае, здесь ничего не идет.

Я сделал простой пакетный скрипт в качестве таймера (считая), и он в формате dd: hh: mm: ss, но отображает только то, что необходимо. Например, если дни и часы = 0, это только мм: сс и т. Д.

Теперь у меня возникла небольшая проблема при переходе от 0-9 ...

Я хочу сказать, что 00-01-02-03-04-05 ... Но сейчас говорят: 0-1-2-3-4-5 ...

Допустим, я поместил время в цикл с задержкой в ​​1 секунду, всегда добавляющей одну секунду. Я сделал числовую переменную /a, так как я работаю с числами. Но я не могу понять, как добавить 0 перед числом, если оно меньше 10 ...

До сих пор я пробовал следующее:

echo %s:""=0%

Неважно, я придумала решение при наборе этого ... Смотрите мой ответ

Ответы [ 3 ]

0 голосов
/ 03 ноября 2019

Это на самом деле намного проще, чем кажется.

Чтобы преобразовать любые простые (не 32-битные) числа в число из ведущих нулей:

Просто вычтите разницу между вашим значением с помощью2 впереди минус ваше значение с одним впереди, от вашего значения с одним впереди.

т.е. 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 голосов
/ 03 ноября 2019

Это мой последний код, и он работает, потому что я всегда применяю отступы, если есть место для этого.

Простое решение простой проблемы.

@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()
0 голосов
/ 02 ноября 2019

Решение это -> set s=0%s%, а затем просто конвертировать обратно в числовое значение ... Делая set /a s+=0 Черт ...

...