如何在 Batch FOR 循环中用零填充数字?

Can*_*uke 5 windows-7 batch-file

我正在编写一个批处理文件来在我的建筑物中的远程计算机上执行一些操作。它们都以相同的前缀命名,但末尾的数字发生了变化(01-65)。我尝试按照在线教程创建基于数字的批处理文件循环,并想出了这个:

FOR /l %%N in (1,1,65) do (
    set HOSTNAMETOUSE=prefix-%%N
    ECHO %HOSTNAMETOUSE%
)
Run Code Online (Sandbox Code Playgroud)

这在达到 10 后效果很好,因为它是两位数。我需要的是数字1-9显示为01-09,因为这与我们的命名模式相匹配。本质上,我需要前 9 次迭代的前导零的个位数。如何使用 Windows 批处理文件完成此操作?

dbe*_*ham 10

您发布的代码可能无法工作,因为%HOSTNAMETOUSE%在解析语句时展开,并且在执行循环之前,整个带括号的块在一次传递中被解析。因此,所有迭代的扩展值都是恒定的。

您必须使用延迟扩展来获取执行时间的值。

@echo off
setlocal enableDelayedExpansion
FOR /l %%N in (1,1,65) do (
    set HOSTNAMETOUSE=prefix-%%N
    ECHO !HOSTNAMETOUSE!
)
Run Code Online (Sandbox Code Playgroud)

现在根据需要添加 0 前缀。

由于您永远不需要超过一个 0,因此您可以使用 IF 语句。

@echo off
setlocal enableDelayedExpansion
FOR /l %%N in (1,1,65) do (
    if %%N lss 10 (set HOSTNAMETOUSE=prefix-0%%N) else set HOSTNAMETOUSE=prefix-%%N
    ECHO !HOSTNAMETOUSE!
)
Run Code Online (Sandbox Code Playgroud)

但是如果您的号码宽度超过 2 位,这就不方便了。更通用的解决方案是添加具有所需长度的n 个零的字符串,然后使用子字符串操作来保留最右边的n 个数字。

@echo off
setlocal enableDelayedExpansion
FOR /l %%N in (1,1,65) do (
    set "n=00%%N"
    set "HOSTNAMETOUSE=!n:~-2!
    ECHO !HOSTNAMETOUSE!
)
Run Code Online (Sandbox Code Playgroud)

您可以轻松地将此解决方案扩展到几乎任何数量的前导零。