在Windowsbatch file中的string处理:如何用前导零填充值?

Windows cmdbatch file(.bat)中,我如何填充一个数字值,以便0到99范围内的给定值转换为范围“00”到“99”的string。 也就是说,我希望前导零值低于10。

您可以使用两个阶段的过程:

REM initial setup SET X=5 REM pad with your desired width - 1 leading zeroes SET PADDED=0%X% REM slice off any zeroes you don't need -- BEWARE, this can truncate the value REM the 2 at the end is the number of desired digits SET PADDED=%PADDED:~-2% 

现在TEMP保持填充的值。 如果有可能X的初始值可能超过2位数,则需要检查是否没有意外截断它:

 REM did we truncate the value by mistake? if so, undo the damage SET /A VERIFY=1%X% - 1%PADDED% IF NOT "%VERIFY%"=="0" SET PADDED=%X% REM finally update the value of X SET X=%PADDED% 

重要的提示:

此解决方案创建或覆盖变量PADDEDVERIFY 。 任何设置变量值的脚本,在终止之后都不会被SETLOCAL ,应该放在SETLOCALENDLOCAL语句中,以防止这些变化从外部可见。

如果您确信原始数字中的数字总是小于2,那么

 set "x=0%x%" set "x=%x:~-2%" 

如果数字可能超过2位数,并且您想填充2位数字,但不是截断大于99的值,则

 setlocal enableDelayedExpansion if "%x%" equ "%x:~-2%" ( set "x=0%x%" set "x=!x:~-2!" ) 

或者没有延迟的扩展,使用一个中间变量

 set paddedX=0%x% if "%x%" equ "%x:~-2%" set "x=%paddedX:~-2%" 

上述算法的好处是将填充扩展到任意宽度是微不足道的。 例如,要填充到宽度10,只需添加9个零并保留最后10个字符

 set "x=000000000%x%" set "x=%x:~-10%" 

为了防止截断

 set paddedX=000000000%x% if "%x%" equ "%x:~-10%" set "x=%paddedX:~-10%" 

单线

 IF 1%Foo% LSS 100 SET Foo=0%Foo% 

会得到你想要的数字在你指定的范围内。 如果它们已经是单填充的,它不会更改子集0-9中的值。

以前的答案已经解释了所有现有的方法用左边的零填充一个值; 我只是想添加一个小窍门,我曾经以一种更简单的方式做到这一点。 在以前的回答中没有提到的是,在大多数情况下, 填充的值会在循环内递增 ,填充的值只是用来显示它 (或类似的任务,如重命名)。 例如,要显示从00到99的值:

 set x=0 :loop rem Pad x value, store it in padded set padded=0%x% set padded=%padded:~-2% rem Show padded value echo %padded% set /A x+=1 if %x% leq 99 goto loop 

如果是这种情况,则变量的值可以用于控制循环, 并且如果其限制被适当地转换,则不显示修改地显示其填充值。 例如,要显示从00到99的值:

 set x=100 :loop rem Show padded value echo %x:~-2% set /A x+=1 if %x% leq 199 goto loop 

此方法也适用于任何数量的左零填充。

安东尼奥

这个例子使用for循环来演示,但是即使你没有使用循环,逻辑也是一样的。 如果数字小于10,只需在前面echo 0

 setlocal enabledelayedexpansion for /l %%a in (1,1,40) do ( set n=%%a if !n! lss 10 ( echo 0!n! ) else ( echo !n! ) ) pause >nul 

OK GUYS我找到了一个解决方案,尽可能简单地压缩它。

 @echo off title pad numbers set num=0 set zero= 000 :loop @set /a num=%num%+1 if /i %num% GTR 9 set zero= 00 if /i %num% GTR 99 set zero= 0 if /i %num% GTR 999 set zero= echo %zero%%num% goto loop 

这将使用4位数字显示您的向上计数。 但代码可以更改为使用2位数字,如下所示。

 @echo off title pad numbers set num=0 set zero= 0 :loop @set /a num=%num%+1 if /i %num% GTR 9 set zero= echo %zero%%num% goto loop 

如果你想把它设置为一个可显示的单个变量…

 @echo off title pad numbers set num=0 set zero= 0 :loop @set /a num=%num%+1 if /i %num% GTR 9 set zero= set %zero%%num%=number echo %number% goto loop 

如果你想要它在几秒钟内计数…

 @echo off title pad numbers set num=0 set zero= 0 :loop @set /a num=%num%+1 if /i %num% GTR 9 set zero= set %zero%%num%=number echo %number% ping localhost -n 2 >nul goto loop 

我希望这是一个很大的帮助^^

 @echo off rem . rem counter example - with and without padding (up to 260 leading 0s which should be enough for most filenames) rem . rem we assume values given are valid rem additional error checking could be done to make sure they are numbers rem and to ensure that starting is less than ending rem and that the number of ending digits is not greater than the number of padding digits rem . if "%2"=="" ( echo. echo usage: %~nx0 [starting number] [ending number] [pad] echo example: %~nx0 0 19 will output numbers 0 to 19 each on a new line echo example: %~nx0 3 12 8 will output numbers 3 to 12 each on a new line padded to 8 digits echo. goto end ) rem . setlocal enabledelayedexpansion if "%3"=="" ( for /l %%x in (%1, 1, %2) do ( echo.%%x ) ) else ( set "mynum=" for /l %%x in (%1, 1, %2) do ( call set "mynum=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000%%x" call set "mynum=%%mynum:~-%3%%" call echo.%%mynum%% ) ) :end