[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] [已解决]生成10个正向或者反向的序列号生成器的批处理怎样简化?

我自已写个很笨的,生成10个正向或者反向的序列号生成器。
  1. @ECHO OFF
  2. echo.
  3. set /p SN=请输入初始字符串:
  4. echo.
  5. echo    请选择生成的数字方向
  6. echo.
  7. echo    A、正序
  8. echo.
  9. echo    B、反序
  10. echo.
  11. echo.
  12. set choice=
  13. choice /c ab /M     请输入选择的字母,不区分大小写,不需要回车:
  14. IF NOT "%Choice%"=="" SET Choice=%Choice:~0,1%
  15. if errorlevel 2 goto fan
  16. if errorlevel 1 goto zheng
  17. :zheng
  18. echo.
  19. set a=%sn%
  20. set var1=%a:~0,-2%
  21. set var2=%a:~12,14%
  22. echo %var1%%var2%
  23. set /a var3=%var2%+1
  24. if %var3% lss 10 (
  25. set "var3=0%var3%")
  26. echo %var1%%var3%
  27. set /a var4=%var2%+2
  28. if %var3% lss 10 (
  29. set "var4=0%var4%")
  30. echo %var1%%var4%
  31. set /a var5=%var2%+3
  32. if %var5% lss 10 (
  33. set "var5=0%var5%")
  34. echo %var1%%var5%
  35. set /a var6=%var2%+4
  36. if %var6% lss 10 (
  37. set "var6=0%var6%")
  38. echo %var1%%var6%
  39. set /a var7=%var2%+5
  40. if %var7% lss 10 (
  41. set "var7=0%var7%")
  42. echo %var1%%var7%
  43. set /a var8=%var2%+6
  44. if %var8% lss 10 (
  45. set "var8=0%var8%")
  46. echo %var1%%var8%
  47. set /a var9=%var2%+7
  48. if %var9% lss 10 (
  49. set "var9=0%var9%")
  50. echo %var1%%var9%
  51. set /a var10=%var2%+8
  52. if %var10% lss 10 (
  53. set "var10=0%var10%")
  54. echo %var1%%var10%
  55. set /a var11=%var2%+9
  56. if %var11% lss 10 (
  57. set "var11=0%var11%")
  58. echo %var1%%var11%
  59. echo.
  60. goto end
  61. :fan
  62. echo.
  63. set a=%sn%
  64. set var1=%a:~0,-2%
  65. set var2=%a:~12,14%
  66. echo %var1%%var2%
  67. set /a var3=%var2%-1
  68. if %var3% lss 10 (
  69. set "var3=0%var3%")
  70. echo %var1%%var3%
  71. set /a var4=%var2%-2
  72. if %var4% lss 10 (
  73. set "var4=0%var4%")
  74. echo %var1%%var4%
  75. set /a var5=%var2%-3
  76. if %var5% lss 10 (
  77. set "var5=0%var5%")
  78. echo %var1%%var5%
  79. set /a var6=%var2%-4
  80. if %var6% lss 10 (
  81. set "var6=0%var6%")
  82. echo %var1%%var6%
  83. set /a var7=%var2%-5
  84. if %var7% lss 10 (
  85. set "var7=0%var7%")
  86. echo %var1%%var7%
  87. set /a var8=%var2%-6
  88. if %var8% lss 10 (
  89. set "var8=0%var8%")
  90. echo %var1%%var8%
  91. set /a var9=%var2%-7
  92. if %var9% lss 10 (
  93. set "var9=0%var9%")
  94. echo %var1%%var9%
  95. set /a var10=%var2%-8
  96. if %var10% lss 10 (
  97. set "var10=0%var10%")
  98. echo %var1%%var10%
  99. set /a var11=%var2%-9
  100. if %var11% lss 10 (
  101. set "var11=0%var11%")
  102. echo %var1%%var11%
  103. echo.
  104. goto end
  105. goto end
  106. :end
  107. pause
复制代码
比如,我输入: BBC3308Y289263

正向的结果:
BBC3308Y289263
BBC3308Y289264
BBC3308Y289265
BBC3308Y289266
BBC3308Y289267
BBC3308Y289268
BBC3308Y289269
BBC3308Y289270
BBC3308Y289271
BBC3308Y289272

反向的结果:
BBC3308Y289263
BBC3308Y289262
BBC3308Y289261
BBC3308Y289260
BBC3308Y289259
BBC3308Y289258
BBC3308Y289257
BBC3308Y289256
BBC3308Y289255
BBC3308Y289254

我试用后发现“反向”只要最后两位大于09,就不会出错,但是如果最后两位小于09,就会变成负数,出错。请问这种情况要怎么处理。

比如,我输入:BBC3308Y289203
结果就变成下面这样了。
BBC3308Y289203
BBC3308Y289202
BBC3308Y289201
BBC3308Y289200
BBC3308Y28920-1
BBC3308Y28920-2
BBC3308Y28920-3
BBC3308Y28920-4
BBC3308Y28920-5
BBC3308Y28920-6

正确的结果应该是:
BBC3308Y289203
BBC3308Y289202
BBC3308Y289201
BBC3308Y289200
BBC3308Y289199
BBC3308Y289198
BBC3308Y289197
BBC3308Y289196
BBC3308Y289195
BBC3308Y289194

看看大家是怎么写这种功能的批处理,想学习一下。

这是生成10个,我还可以写,如果生成100个,1000个,那就要晕了。还是学习一下,用循环是怎么写的。

这个输入的序号是固定14位的,我只需要计算最后2位数字就可以了。其实为负数时是不是要计算最后3位,但是如果是计算最后3位。如果最后3位为003时,我想也存在这个问题。没想明白。

谢谢!

本帖最后由 77七 于 2022-10-29 03:05 编辑

写了好几次,最后就这样吧
  1. @echo off
  2. echo.
  3. set /p sn=请输入初始字符串:
  4. echo.
  5. set /p num=请输入生成的序列号数量:
  6. echo.
  7. echo    A、正序  B、反序
  8. echo.
  9. set /p choice=请选择生成的数字方向(A/B,区分大小写):
  10. set a=%sn%
  11. set var1=%a:~0,8%
  12. set var2=%a:~8,6%
  13. if "%choice%"=="A" (
  14. set d=+
  15. ) else (
  16. set d=-
  17. )
  18. set c=0
  19. :m
  20. echo %var1%%var2%>>序列号.txt
  21. set /a var2=var2%d%1
  22. set /a c=c+1
  23. if %c% lss %num% goto :m else (
  24. echo 完成
  25. )
  26. pause
复制代码

TOP

  1. @echo off
  2. @rem 保存为ANSI格式
  3. set SN=BBC3308Y289263
  4. set "n="
  5. :SN_loop
  6. set n1=%SN:~-1%
  7. if %n1% GEQ 0 if %n1% LEQ 9 (
  8. set n=%n1%%n%
  9. set SN=%SN:~0,-1%
  10. goto :SN_loop
  11. )
  12. echo;
  13. set /a n1=n+10
  14. for /l %%a in (%n%,1,%n1%) do echo;%SN%%%a
  15. echo;
  16. set /a n1=n-10
  17. for /l %%a in (%n%,-1,%n1%) do echo;%SN%%%a
复制代码

TOP

回复 1# thp2008
后面6位数值都要考虑在内才行。
正向BBC3308Y199999
反向BBC3308Y200000
看看上面2个例子即知。

TOP

本帖最后由 qixiaobin0715 于 2022-10-30 08:06 编辑

批处理文件另存为ANSI编码:
  1. @echo off
  2. set /p SN=请输入初始字符串:
  3. set /p NUM=请输入生成数量:
  4. set /p SEQ=请选择正反序(输入字母P为正序,输入其它字母为反):
  5. set var=%SN:~,8%
  6. set n=%SN:~-6%
  7. if /i %SEQ% equ P (
  8.     set /a SV=%n%
  9.     set /a EV=%n%+%num%-1
  10. ) else (
  11.     set /a EV=%n%
  12.     set /a SV=%n%-%num%+1
  13. )
  14. (for /l %%i in (%SV%,1,%EV%) do echo,%var%%%i)
  15. pause
复制代码
花拳绣腿的显示自己添加。
3个变量设置“set /p”规范输入的判断语句,自己写写。

TOP

回复  77七
批处理文件另存为ANSI编码:花拳绣腿的显示自己添加。
3个变量设置“set /p”规范输入的判断 ...
qixiaobin0715 发表于 2022-10-29 10:54



    感谢大家,简单多了,学到了。再次表示感谢!

不过有个小问题,就是反序的时候,我要求从大往小排序,这个该怎么改一下。

比如下面这个,运行后的结果是对的,但是排序是从小到大的。因为我需要直接复制到表格中,要求是反过来排序的。
请输入初始字符串:BBC3308Y289203
请输入生成数量:10
请选择正反序(输入字母P为正序,输入其它字母为反):a
BBC3308Y289194
BBC3308Y289195
BBC3308Y289196
BBC3308Y289197
BBC3308Y289198
BBC3308Y289199
BBC3308Y289200
BBC3308Y289201
BBC3308Y289202
BBC3308Y289203
请按任意键继续. . .

我要求,要像下面这样显示:

BBC3308Y289203
BBC3308Y289202
BBC3308Y289201
BBC3308Y289200
BBC3308Y289199
BBC3308Y289198
BBC3308Y289197
BBC3308Y289196
BBC3308Y289195
BBC3308Y289194

再麻烦一下,帮我改一下。非常感谢!

TOP

  1. <# :
  2. @echo off
  3. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
  4. pause
  5. #>
  6. $a=Read-Host "请输入初始字符串"
  7. $b=Read-Host "请输入生成数量"
  8. $c=Read-Host "请选择正反序(输入1为正序,输入-1为反)"
  9. [int]$a.Substring(8)..([int]$a.Substring(8)+[int]$b*[int]$c-[int]$c)|%{$a.Substring(0,8)+$_.tostring()}
复制代码
1

评分人数

    • thp2008: 满足需求,感谢技术 + 1

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /p SN=请输入初始字符串(大于6个字符,后6位必须为数字):
  4. set /p NUM=请输入生成数量:
  5. set /p SEQ=请选择正反序(输入+为正序,输入-为反序):
  6. set "var=%SN:~0,-6%"
  7. set /a n1 = 1%SN:~-6%, n2 = n1 %SEQ% ( NUM - 1 )
  8. for /L %%i in (%n1%,%SEQ%1,%n2%) do (
  9.     set "s=%%i"
  10.     echo;%var%!s:~-6!
  11. )
  12. pause
复制代码
2

评分人数

TOP

本帖最后由 77七 于 2022-10-29 20:57 编辑

回复 9# WHY 写的真巧妙!!
bat小白,请多指教!谢谢!

TOP

我慢慢消化一下,越来越精简了。牛

TOP

返回列表