找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 39|回复: 0

[文本处理] 【已解决】两个代码合并需要解决延迟变量的问题

[复制链接]
发表于 5 小时前 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 2026-5-7 14:41 编辑

先运行代码1,依靠代码1生成的文件,再运行代码2,能够正常运行。将代码1+代码2合并,闪退。可能是延迟变量的问题,请帮助修改。

  1. :: ================= 代码1 =================
  2. @echo off
  3. setlocal enabledelayedexpansion

  4. for /l %%d in (10000,1,10000) do (
  5.     set o=%%d
  6.     for /l %%e in (100009,1,100009) do (
  7.         set p=%%e
  8.         "Z:\KZ\001\gawk.exe" -F"=" "NR==FNR{B[i++]=$0;next}{A[$1]=$2}END{for(i=0;i<length(B);i++){print A[B[i]]}}" "Z:\QWS\数据\!o:~1!\1234_01_2.txt" "Z:\SJKZ原版\!p:~1!.txt" | "Z:\KZ\001\gawk.exe" "NR%%8==1{close(\"Z:/KZ/001/\"n\"A.txt\");++n}{print>\"Z:/KZ/001/\"n\"A.txt\"}"

  9.         "Z:\KZ\001\gawk.exe" -f "Z:\KZ\001\replace_001.gawk"
  10.         del /q "Z:\KZ\001\*A.txt">nul 2>&1

  11.         for /l %%f in (1001,1,1500) do (
  12.             set q=%%f
  13.             "Z:\KZ\001\gawk.exe" -v "N=1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24&25&26&27&28&29&30&31&32" -v "RS=\r?\n| " -v "ORS= " -f "Z:\KZ\001\词频_001.gawk" "Z:\KZ\001\A\!q:~1!.txt"
  14.         )
  15.     )
  16. )
  17. endlocal
  18. :: ================= 代码1 结束=================



  19. :: ================= 代码2 =================
  20. @echo off
  21. setlocal enabledelayedexpansion

  22. :: 1. 生成 seq.txt
  23. (for /l %%i in (0,1,9999) do (
  24.     set "num=0000%%i"
  25.     echo !num:~-4!
  26. )) > "Z:\KZ\001\seq.txt"

  27. :: 2. 动态计算最小小组数
  28. echo 正在计算最小小组数...
  29. set MIN_GROUP=999999
  30. for %%f in (11 12 13 14 15 16 17 18 19 20 21 22 23) do (
  31.     Z:\KZ\001\gawk.exe "{print int((NF-1)/5000)}" "Z:/KZ/001/%%fM.txt" > "Z:\KZ\001\tmp_cnt.txt"
  32.     set /p cnt=<"Z:\KZ\001\tmp_cnt.txt"
  33.     echo %%f: !cnt!
  34.     if !cnt! lss !MIN_GROUP! set MIN_GROUP=!cnt!
  35. )
  36. del "Z:\KZ\001\tmp_cnt.txt"
  37. echo 最小小组数: %MIN_GROUP%

  38. :: 3. 处理每个小组
  39. if %MIN_GROUP% leq 0 (
  40.     echo 错误:最小小组数为0,请检查数据。
  41.     pause
  42.     exit /b
  43. )

  44. echo 处理小组1~%MIN_GROUP%...
  45. for /l %%g in (1,1,%MIN_GROUP%) do (
  46.     echo 小组 %%g
  47.     set /a "start=(%%g-1)*5000+1"
  48.     set /a "end=%%g*5000"
  49.     set "outfile=Z:\KZ\001\0000%%g.txt"
  50.     type nul > "!outfile!"
  51.     for %%f in (11 12 13 14 15 16 17 18 19 20 21 22 23) do (
  52.         Z:\KZ\001\gawk.exe -v s=!start! -v e=!end! "{n=split($0,a,\" \"); if(e<=n){for(i=s;i<=e;i++) printf a[i] (i==e?\"\":\" \")}}" "Z:/KZ/001/%%fM.txt" | Z:\KZ\001\gawk.exe "{split($0,a,\" \"); for(i in a) c[a[i]]++; while((getline s<\"Z:/KZ/001/seq.txt\")>0) c[s]++; for(i in c) if(c[i]==2) print i}" >> "!outfile!"
  53.     )
  54. )

  55. :: 4. 求交集
  56. echo 计算交集...
  57. Z:\KZ\001\gawk.exe "FNR==1{No++}{for(i=0;i++<NF;)a[No][$i]=1}END{for(i in a)for(j in a[i])if(++d[j]==No)print j}" "Z:/KZ/001/0000*.txt" > "Z:/KZ/001/交集结果.txt"

  58. :: 5. 显示结果
  59. echo 交集结果已保存至 Z:\KZ\001\交集结果.txt
  60. find /c /v "" "Z:\KZ\001\交集结果.txt"
  61. del "Z:\KZ\001\seq.txt" 2>nul
  62. pause
  63. :: ================= 代码2 结束=================




  64. ::=================【问题:代码2 插入代码1(运行闪退)】=================

  65. @echo off
  66. setlocal enabledelayedexpansion

  67. for /l %%d in (10000,1,10000) do (
  68.     set o=%%d
  69.     for /l %%e in (100009,1,100009) do (
  70.         set p=%%e
  71. :: ================= 代码1 =================
  72.         "Z:\KZ\001\gawk.exe" -F"=" "NR==FNR{B[i++]=$0;next}{A[$1]=$2}END{for(i=0;i<length(B);i++){print A[B[i]]}}" "Z:\QWS\数据\!o:~1!\1234_01_2.txt" "Z:\SJKZ原版\!p:~1!.txt" | "Z:\KZ\001\gawk.exe" "NR%%8==1{close(\"Z:/KZ/001/\"n\"A.txt\");++n}{print>\"Z:/KZ/001/\"n\"A.txt\"}"

  73.         "Z:\KZ\001\gawk.exe" -f "Z:\KZ\001\replace_001.gawk"
  74.         del /q "Z:\KZ\001\*A.txt">nul 2>&1

  75.         for /l %%f in (1001,1,1500) do (
  76.             set q=%%f
  77.             "Z:\KZ\001\gawk.exe" -v "N=1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24&25&26&27&28&29&30&31&32" -v "RS=\r?\n| " -v "ORS= " -f "Z:\KZ\001\词频_001.gawk" "Z:\KZ\001\A\!q:~1!.txt"
  78.         )
  79. :: ================= 代码1 结束=================


  80. :: ================= 代码2=================
  81. :: 1. 生成 seq.txt
  82. (for /l %%i in (0,1,9999) do (
  83.     set "num=0000%%i"
  84.     echo !num:~-4!
  85. )) > "Z:\KZ\001\seq.txt"

  86. :: 2. 动态计算最小小组数
  87. echo 正在计算最小小组数...
  88. set MIN_GROUP=999999
  89. for %%f in (11 12 13 14 15 16 17 18 19 20 21 22 23) do (
  90.     Z:\KZ\001\gawk.exe "{print int((NF-1)/5000)}" "Z:/KZ/001/%%fM.txt" > "Z:\KZ\001\tmp_cnt.txt"
  91.     set /p cnt=<"Z:\KZ\001\tmp_cnt.txt"
  92.     echo %%f: !cnt!
  93.     if !cnt! lss !MIN_GROUP! set MIN_GROUP=!cnt!
  94. )
  95. del "Z:\KZ\001\tmp_cnt.txt"
  96. echo 最小小组数: !MIN_GROUP!

  97. :: 3. 处理每个小组
  98. if !MIN_GROUP! leq 0 (
  99.     echo 错误:最小小组数为0,请检查数据。
  100.     pause
  101.     exit /b
  102. )

  103. echo 处理小组1~!MIN_GROUP!...
  104. for /l %%g in (1,1,!MIN_GROUP!) do (
  105.     echo 小组 %%g
  106.     set /a "start=(%%g-1)*5000+1"
  107.     set /a "end=%%g*5000"
  108.     set "outfile=Z:\KZ\001\0000%%g.txt"
  109.     type nul > "!outfile!"
  110.     for %%f in (11 12 13 14 15 16 17 18 19 20 21 22 23) do (
  111.         Z:\KZ\001\gawk.exe -v s=!start! -v e=!end! "{n=split($0,a,\" \"); if(e<=n){for(i=s;i<=e;i++) printf a[i] (i==e?\"\":\" \")}}" "Z:/KZ/001/%%fM.txt" | Z:\KZ\001\gawk.exe "{split($0,a,\" \"); for(i in a) c[a[i]]++; while((getline s<\"Z:/KZ/001/seq.txt\")>0) c[s]++; for(i in c) if(c[i]==2) print i}" >> "!outfile!"
  112.     )
  113. )

  114. :: 4. 求交集
  115. echo 计算交集...
  116. Z:\KZ\001\gawk.exe "FNR==1{No++}{for(i=0;i++<NF;)a[No][$i]=1}END{for(i in a)for(j in a[i])if(++d[j]==No)print j}" "Z:/KZ/001/0000*.txt" > "Z:/KZ/001/交集结果.txt"

  117. :: 5. 显示结果
  118. echo 交集结果已保存至 Z:\KZ\001\交集结果.txt
  119. find /c /v "" "Z:\KZ\001\交集结果.txt"
  120. del "Z:\KZ\001\seq.txt" 2>nul
  121. :: ================= 代码2 结束=================

  122.     )
  123. )
  124. endlocal
复制代码





已解决
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. for /l %%d in (10000,1,10000) do (
  4.     set o=%%d
  5.     for /l %%e in (100011,1,100011) do (
  6.         set p=%%e

  7.         rem ================= 代码1 =================
  8.         "Z:\KZ\001\gawk.exe" -F"=" "NR==FNR{B[i++]=$0;next}{A[$1]=$2}END{for(i=0;i<length(B);i++){print A[B[i]]}}" "Z:\QWS\数据\!o:~1!\1234_01_2.txt" "Z:\SJKZ原版\!p:~1!.txt" | "Z:\KZ\001\gawk.exe" "NR%%8==1{close(\"Z:/KZ/001/\"n\"A.txt\");++n}{print>\"Z:/KZ/001/\"n\"A.txt\"}"

  9.         "Z:\KZ\001\gawk.exe" -f "Z:\KZ\001\replace_001.gawk"
  10.         del /q "Z:\KZ\001\*A.txt">nul 2>&1

  11.         for /l %%f in (1001,1,1500) do (
  12.             set q=%%f
  13.             "Z:\KZ\001\gawk.exe" -v "N=1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24&25&26&27&28&29&30&31&32" -v "RS=\r?\n| " -v "ORS= " -f "Z:\KZ\001\词频_001.gawk" "Z:\KZ\001\A\!q:~1!.txt"
  14.         )
  15.         rem ================= 代码1结束 =================


  16.         rem ================= 代码2 =================
  17.         rem 使用 setlocal 隔离代码2的局部变量,避免污染外层
  18.         setlocal enabledelayedexpansion

  19.         rem 1. 生成 seq.txt
  20.         (for /l %%i in (0,1,9999) do (
  21.             set "num=0000%%i"
  22.             echo !num:~-4!
  23.         )) > "Z:\KZ\001\seq.txt"

  24.         rem 2. 动态计算最小小组数
  25.         echo 正在计算最小小组数...
  26.         set MIN_GROUP=999999
  27.         for %%f in (11 12 13 14 15 16 17 18 19 20 21 22 23) do (
  28.             Z:\KZ\001\gawk.exe "{print int((NF-1)/5000)}" "Z:/KZ/001/%%fM.txt" > "Z:\KZ\001\tmp_cnt.txt"
  29.             set /p cnt=<"Z:\KZ\001\tmp_cnt.txt"
  30.             echo %%f: !cnt!
  31.             if !cnt! lss !MIN_GROUP! set MIN_GROUP=!cnt!
  32.         )
  33.         del "Z:\KZ\001\tmp_cnt.txt"
  34.         echo 最小小组数: !MIN_GROUP!

  35.         if !MIN_GROUP! leq 0 (
  36.             echo 错误:最小小组数为0,请检查数据。
  37.             pause
  38.             exit /b
  39.         )

  40.         rem 3. 处理每个小组(注意边界必须用延迟变量)
  41.         echo 处理小组1~!MIN_GROUP!...
  42.         for /l %%g in (1,1,!MIN_GROUP!) do (
  43.             echo 小组 %%g
  44.             set /a "start=(%%g-1)*5000+1"
  45.             set /a "end=%%g*5000"
  46.             rem 文件名补零到4位:0001.txt 等,%%g 取位
  47.             set "gnum=0000%%g"
  48.             set "outfile=Z:\KZ\001\!gnum:~-4!.txt"
  49.             type nul > "!outfile!"
  50.             for %%f in (11 12 13 14 15 16 17 18 19 20 21 22 23) do (
  51.                 Z:\KZ\001\gawk.exe -v s=!start! -v e=!end! "{n=split($0,a,\" \"); if(e<=n){for(i=s;i<=e;i++) printf a[i] (i==e?\"\":\" \")}}" "Z:/KZ/001/%%fM.txt" | Z:\KZ\001\gawk.exe "{split($0,a,\" \"); for(i in a) c[a[i]]++; while((getline s<\"Z:/KZ/001/seq.txt\")>0) c[s]++; for(i in c) if(c[i]==2) print i}" >> "!outfile!"
  52.             )
  53.         )

  54.         rem 4. 求交集
  55.         echo 计算交集...
  56.         Z:\KZ\001\gawk.exe "FNR==1{No++}{for(i=0;i++<NF;)a[No][$i]=1}END{for(i in a)for(j in a[i])if(++d[j]==No)print j}" "Z:/KZ/001/00*.txt" > "Z:/KZ/001/交集结果.txt"

  57.         rem 5. 显示结果
  58.         echo 交集结果已保存至 Z:\KZ\001\交集结果.txt
  59.         find /c /v "" "Z:\KZ\001\交集结果.txt"
  60.         del "Z:\KZ\001\seq.txt" 2>nul

  61.         endlocal
  62.         rem ================= 代码2结束 =================
  63.     )
  64. )
  65. endlocal
  66. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-5-7 19:03

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表