![如何在批量 FOR 循环中用零填充数字?](https://linux22.com/image/1428574/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%89%B9%E9%87%8F%20FOR%20%E5%BE%AA%E7%8E%AF%E4%B8%AD%E7%94%A8%E9%9B%B6%E5%A1%AB%E5%85%85%E6%95%B0%E5%AD%97%EF%BC%9F.png)
我正在编写一个批处理文件来对我大楼内的远程计算机执行一些操作。它们都以相同的前缀命名,但末尾的数字会发生变化(01-65)。我尝试按照在线教程创建基于数字的批处理文件循环,并得出以下结论:
FOR /l %%N in (1,1,65) do (
set HOSTNAMETOUSE=prefix-%%N
ECHO %HOSTNAMETOUSE%
)
在达到 10 之后,效果很好,因为那时它是两位数。我需要的是数字1-9
显示为01-09
,因为这符合我们的命名模式。本质上,我需要前 9 次迭代的前导零的个位数。如何使用 Windows 批处理文件实现此目的?
答案1
您发布的代码不可能工作,因为%HOSTNAMETOUSE%
在解析语句时会展开,并且在执行循环之前会一次性解析整个括号内的块。因此,展开的值对于所有迭代都是恒定的。
您必须使用延迟扩展才能在执行时获取值。
@echo off
setlocal enableDelayedExpansion
FOR /l %%N in (1,1,65) do (
set HOSTNAMETOUSE=prefix-%%N
ECHO !HOSTNAMETOUSE!
)
现在根据需要在前缀中添加 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!
)
但如果数字宽度超过 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!
)
您可以轻松地将此解决方案扩展到几乎任意数量的前导零。
答案2
我会这样做:
- 在每个数字后面添加“0”(例如“01”和“065”)
- 此字符串的最后 2 个字符作为子字符串
如何在批处理文件中执行子字符串(最后 2 个字符):
SET string=abcd
echo %string%
SET string2=%string:~-2%
echo %string2%
答案3
@dbenham 的回答没有什么新意,只是从命令行收集了一些值变量并将其放在这里以方便复制和粘贴 - 信用全部来自上面的@dbenham:
set first=%1
set last=%2
set len=%3
setlocal EnableDelayedExpansion
FOR /l %%N in (%first%, 1, %last%) do (
set "n=0000000000000%%N"
set "padded=!n:~-%len%!
echo !padded!
)
答案4
使用智树赢,按 导航到正确的目录\,然后Enter按 进入目录,您可以在其中CtrlT标记要重命名的文件,然后CtrlR将其重命名为????<0>*.*
例如:
foo-0-bar.jpg -> foo-00-bar.jpg
foo-1-bar.jpg -> foo-01-bar.jpg
foo-2-bar.jpg -> foo-02-bar.jpg
...
在上面的例子中,????
代表前 4 个字符(foo-),<0>
在第 5 个位置插入一个零,*.*
代表文件名的其余部分(-bar.jpg)将保持不变。
标记您的文件:
重命名文件:
智树赢是一款功能强大的 32 位和 64 位文本模式文件和目录管理器,其模型与传奇的 XTreeGold(tm) 非常相似,但针对当今流行的操作系统进行了增强。