Board logo

标题: [数值计算] 批处理如何在数字前面添加0/补充0/加零使得数字的长度达到指定位数 [打印本页]

作者: vq86    时间: 2016-11-21 22:38     标题: 批处理如何在数字前面添加0/补充0/加零使得数字的长度达到指定位数

本帖最后由 pcl_test 于 2017-4-22 14:49 编辑

关于数字0填充个位数,提示“无效数字”

set i=0
set /a i=%i%+1
if %i% lss 10 set i=0%i%
if %i% leq 60 goto ag

如上,我想把小于10的个位数用0填充,但为什么到了08,09的时候会出现“无效数字......”,并且后面会%i%变成008.0008.00008.000008,一直重复
,这错误在哪里,实在不知道,那如果百位填充千位填充呢?
作者: pcl_test    时间: 2016-11-21 22:56

set /?
……
如果 SET /A 在命令脚本外的命令行执行的,那么它显示该表达式的最后值。该分配的操作符在分配的操作符左边需要一个环境变量名称。除十六进制有 0x 前缀,八进制有 0 前缀的,数字值为十进位数字。因此,0x12 与 18 和 022相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,因为 8 和 9 不是有效的八进制位数。
……
作者: vq86    时间: 2016-11-21 23:15

回复 2# pcl_test


    那难道默认的批处理中采用的是8进制???那我想用10进制该当如何?
作者: pcl_test    时间: 2016-11-21 23:21

除十六进制有 0x 前缀,八进制有 0 前缀的,数字值为十进位数字。因此,0x12 与 18 和 022相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,因为 8 和 9 不是有效的八进制位数

不知你怎么理解的,明明告诉你默认是十进制数,你在小于10的数字前补0才变成八进制数
作者: vq86    时间: 2016-11-22 00:47

回复 4# pcl_test


    那现在,我要表示08,如题里的命令,我要表示08,和09,应如何表示。
作者: vq86    时间: 2016-11-22 00:49

回复 4# pcl_test


        那现在,我要表示08,如题里的命令,我要表示08,和09,应如何表示。
我目前的处理方法是
if %i% == 008 set i=9
if %i% == 009 set i=10
如此来定义以便跳过其“无效数字”,但我知道,这不是可行的的,如果我要千位或百位填充0,那不一样搞死我。
作者: pcl_test    时间: 2016-11-22 01:00

从10001开始,每次截取数字后2位,到10060结束,就可得到01、02……60,百位截取后3位,千位截取后4位,论坛一搜一堆
作者: vq86    时间: 2016-11-22 01:13

回复 7# pcl_test


    只能如此???无法从0起始?
作者: /zhqsystem/zhq    时间: 2016-11-22 02:47

本帖最后由 /zhqsystem/zhq 于 2016-11-22 03:49 编辑

回复 1# vq86

  1. @echo off&setlocal enabledelayedexpansion
  2. set "数值=1234567890"
  3. set "取值位数=8000"
  4. rem:以下到pause前如果存在复式内用!替换%
  5. set "Character=%数值%"&&rem:此行为必须行
  6. set "Character_contrast=%取值位数%"&&rem:此行为必须行
  7. call :强制补0 &&rem:调用其中一种
  8. call :检测补0 &&rem:调用其中一种
  9. set "数值=!Character!"&&rem:此行为必须行
  10. echo,!数值!&&rem:此行为必须行
  11. pause
  12. goto:eof
  13. :检测补0
  14. rem:数值取值N位,不足时高位用 0 补足,超出时则去除高位
  15. set "Character_Numbers_span=50"
  16. set "Character_Numbers_Small="&&for /l %%n in (0,!Character_Numbers_span!,8192)do if /i not "!Character:~%%~n,1!"=="" (set "Character_Numbers_Small=%%~n")
  17. set/a "Character_Numbers_large=%Character_Numbers_Small%+%Character_Numbers_span%+1"
  18. set "Character_Numbers="&&for /l %%n in (!Character_Numbers_Small!,1,!Character_Numbers_large!)do if /i not "!Character:~%%~n,1!"=="" (set/a "Character_Numbers=%%~n+1")
  19. if %Character_Numbers% equ %Character_contrast% (rem:
  20. )else if %Character_Numbers% GTR %Character_contrast% (rem:
  21. set "Character=!Character:~-%Character_contrast%!"
  22. )else if %Character_Numbers% LSS %Character_contrast% (rem:
  23. for /l %%n in (%Character_Numbers%,1,%Character_contrast%)do set "Character=0!Character!"
  24. set "Character=!Character:~-%Character_contrast%!"
  25. )
  26. goto:eof
  27. :强制补0
  28. for /l %%n in (1,1,%Character_contrast%)do set "Character=0!Character!"
  29. set "Character=!Character:~-%Character_contrast%!"
  30. goto:eof
复制代码

作者: GNU    时间: 2016-11-22 13:06

回复 8# vq86


    是的,无法从0起始。
作者: pcl_test    时间: 2016-11-22 15:55

回复 8# vq86

干嘛从0开始,你要的不是01、02……吗?
  1. for /l %%a in (10001 1 10060) do @set n=%%a&call echo;%%n:~-2%%
  2. pause
复制代码
你的思路
  1. @echo off
  2. set i=0
  3. :loop
  4. set /a i=%i%+1
  5. if %i% lss 10 set i=0%i%
  6. echo;%i%
  7. set /a i=1%i%-100
  8. if %i% lss 60 goto loop
  9. pause
复制代码

作者: pcl_test    时间: 2016-11-22 23:45

  1. powershell -c "1..60|%%{'{0:d2}' -f $_}"
  2. pause
复制代码

作者: spendia    时间: 2023-4-7 11:26

@echo off
setlocal EnableDelayedExpansion
cd /d "%~dp0"

::将命令bat文件清空并首行添加 当前目录地址
echo cd/d "%~dp0" > rn.bat


::重命名次数计数归零
set Rename_cnt=0

::起始数字 间隔步长 终止数字
set /P i_Start=起始数
set /P i_End=终止数

::格式化文件名 强制补0 ,比如  歌曲03.MP3  歌曲012.MP3
set /A Num_filename=1000+%i_Start%

for /l  %%i in (%i_Start%,1,%I_End% ) do (

echo copy "2023-歌曲-00.psd" "2023-歌曲-!Num_filename:~-2!.mp3" >>rn.bat
set /A Rename_cnt+=1
set /A Num_filename+=1
)

echo 将开始  !Rename_cnt:~-2!  个文件重命名.
type rn.bat

echo 请检查,然后将开始重命名
pause
echo 请再次确认重命名.
pause
rn.bat
echo 已完成  !Rename_cnt:~-2!  个文件重命名.
goto :eof




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2