无忧启动论坛

标题: 求一个批处理,不胜感激! [打印本页]

作者: 香国妙手    时间: 2024-4-30 09:58
标题: 求一个批处理,不胜感激!
D盘666文件夹内有5个文件,分别为
D:\666\000.txt
D:\666\001.bat
D:\666\002.bat
D:\666\003.bat
D:\666\004.bat

000.txt为随机生成,总共只有两行内容
第一行可能为A或B
第二行可能为C或D

现求一个批处理,自动获取000.txt内容
假如获取的第一行内容为A,第二行内容为C,则call 001.bat
假如获取的第一行内容为A,第二行内容为D,则call 002.bat
假如获取的第一行内容为B,第二行内容为C,则call 003.bat
假如获取的第一行内容为B,第二行内容为D,则call 004.bat

恳请赐教,不胜感激!


作者: WUMEIHAI    时间: 2024-4-30 10:10
  1. @echo off
  2. setlocal EnableDelayedExpansion

  3. REM 读取 000.txt 的内容
  4. for /f "tokens=1,2" %%a in (D:\666\000.txt) do (
  5.     set "line1=%%a"
  6.     set "line2=%%b"
  7. )

  8. REM 根据内容调用相应的批处理文件
  9. if "!line1!"=="A" (
  10.     if "!line2!"=="C" (
  11.         call D:\666\001.bat
  12.     ) else (
  13.         call D:\666\002.bat
  14.     )
  15. ) else (
  16.     if "!line2!"=="C" (
  17.         call D:\666\003.bat
  18.     ) else (
  19.         call D:\666\004.bat
  20.     )
  21. )

  22. endlocal
复制代码

作者: zlq_hysy    时间: 2024-4-30 11:04
很绕口的哈,
作者: 香国妙手    时间: 2024-4-30 11:17
WUMEIHAI 发表于 2024-4-30 10:10

感谢您的热心解答!刚才测试了一下,不管我如何修改000.txt的内容,比如:AC,AD,BC,BD,当然也只有这4种情况,但结果都是运行了004.bat
能否买麻烦您重新修改一下?谢谢!
作者: maisifu    时间: 2024-4-30 11:25
学习。。。
作者: Climbing    时间: 2024-4-30 11:45
WUMEIHAI 发表于 2024-4-30 10:10

2楼这个批处理的问题在于获取000.txt内容时看错了题意,按他的代码,AC组合是在一行上,而且,中间有分隔符,实际上000.txt有两行内容,类似这样:
A
C
所以,他的代码无法获取line1和line2的内容。稍微改一下:


  1. @echo off
  2. setlocal EnableDelayedExpansion

  3. :: 读取 000.txt 的内容
  4. if exist ~setvar.bat del /f/q ~setvar.bat
  5. set n=0
  6. for /f "tokens=*" %%a in (D:\666\000.txt) do (
  7. set /a n=n+1
  8. echo set "line!n!=%%a" >>~setvar.bat
  9. )
  10. call ~setvar.bat
  11. del /f/q ~setvar.bat

  12. REM 根据内容调用相应的批处理文件
  13. if "!line1!"=="A" (
  14.     if "!line2!"=="C" (
  15.         call D:\666\001.bat
  16.     ) else (
  17.         call D:\666\002.bat
  18.     )
  19. ) else (
  20.     if "!line2!"=="C" (
  21.         call D:\666\003.bat
  22.     ) else (
  23.         call D:\666\004.bat
  24.     )
  25. )
  26. endlocal
复制代码

作者: 香国妙手    时间: 2024-4-30 11:52
Climbing 发表于 2024-4-30 11:45
2楼这个批处理的问题在于获取000.txt内容时看错了题意,按他的代码,AC组合是在一行上,而且,中间有分隔 ...

感谢Climbing大神!
完美实现预期效果!
作者: Climbing    时间: 2024-4-30 11:56
问了一下chatGPT,它的第三个回复跟我的思路差不多,但不需要产生临时文件了,如下:

  1. @echo off
  2. setlocal enabledelayedexpansion

  3. rem Set the input file name
  4. set "inputFile=000.txt"

  5. rem Read the content of the file into an array
  6. set i=0
  7. for /f "usebackq tokens=*" %%a in ("%inputFile%") do (
  8.     set /a i+=1
  9.     set "line[!i!]=%%a"
  10. )

  11. rem Assign the lines to separate variables
  12. set "line1=!line[1]!"
  13. set "line2=!line[2]!"

  14. echo First line: !line1!
  15. echo Second line: !line2!

  16. endlocal
复制代码

作者: x光人    时间: 2024-4-30 12:13
学习了!!
作者: wang1126    时间: 2024-4-30 13:19
Climbing 发表于 2024-4-30 11:45
2楼这个批处理的问题在于获取000.txt内容时看错了题意,按他的代码,AC组合是在一行上,而且,中间有分隔 ...

谢谢分享
作者: softwarezheng    时间: 2024-4-30 13:38
感谢天地,感恩有你
作者: 2012飘水    时间: 2024-4-30 13:47
感谢大佬们的精彩答复,学习了
作者: qingyi78    时间: 2024-4-30 14:06
问了下copilot 回答如下:请大家看看CHATGPT和COPILOT的区别。@echo off
setlocal enabledelayedexpansion

REM Read the first line from 000.txt
set "firstLine="
for /f "usebackq delims=" %%a in ("D:\666\000.txt") do (
    set "firstLine=%%a"
    goto :break
)
:break

REM Read the second line from 000.txt
set "secondLine="
for /f "usebackq skip=1 delims=" %%b in ("D:\666\000.txt") do (
    set "secondLine=%%b"
    goto :continue
)
:continue

REM Determine which batch file to call based on the content of the lines
if "!firstLine!"=="A" (
    if "!secondLine!"=="C" (
        call "D:\666\001.bat"
    ) else if "!secondLine!"=="D" (
        call "D:\666\002.bat"
    )
) else if "!firstLine!"=="B" (
    if "!secondLine!"=="C" (
        call "D:\666\003.bat"
    ) else if "!secondLine!"=="D" (
        call "D:\666\004.bat"
    )
)

endlocal


作者: 君临唯一    时间: 2024-4-30 14:14
坐等
作者: hilsonma    时间: 2024-4-30 14:18
本帖最后由 hilsonma 于 2024-4-30 14:26 编辑

如果000.txt的内容确实如同楼主描述的话,可以简化批如下:

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. for /f %%a in (000.txt) do set v=!v!%%a
  4. goto !v!

  5. :AC
  6. 001.bat

  7. :AD
  8. 002.bat

  9. :BC
  10. 003.bat

  11. :BD
  12. 004.bat
复制代码


如果本批不是放在相同文件夹,而是放在其他位置的话,则相应文件名要改为全路径。如:
000.txt 改为 D:\666\000.txt
001.bat 改为 D:\666\001.bat
依次类推。
作者: yc2428    时间: 2024-4-30 15:27
学习了!
作者: lusir401    时间: 2024-4-30 15:34
有大神在,放心学习。
作者: 万人之上    时间: 2024-4-30 17:17
进来学习
作者: Climbing    时间: 2024-4-30 17:19
13楼和15楼的实现都非常巧妙,学习了。
作者: 香国妙手    时间: 2024-4-30 19:55
本帖最后由 香国妙手 于 2024-4-30 20:24 编辑
hilsonma 发表于 2024-4-30 14:18
如果000.txt的内容确实如同楼主描述的话,可以简化批如下:



作者: 香国妙手    时间: 2024-4-30 20:23
本帖最后由 香国妙手 于 2024-4-30 20:43 编辑



作者: szwp    时间: 2024-5-1 07:03
窄口牛 发表于 2024-5-1 00:16
每个标签都必须加一个跳出语句,否则会把所有标签轮流执行一次。

没call不会回来了
作者: szwp    时间: 2024-5-1 07:04
窄口牛 发表于 2024-5-1 00:16
每个标签都必须加一个跳出语句,否则会把所有标签轮流执行一次。

没call不会回来了
作者: 窄口牛    时间: 2024-5-1 07:20
szwp 发表于 2024-5-1 07:04
没call不会回来了

哦,看错了,标签是运行bat。
作者: dos时代菜鸟    时间: 2024-5-1 23:26
本帖最后由 dos时代菜鸟 于 2024-5-1 23:28 编辑
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set "path1=D:\666"
  4. set "file0=!path1!\000.txt"
  5. set AC=001.BAT
  6. SET AD=002.BAT
  7. SET BC=003.BAT
  8. SET BD=004.BAT

  9. set  x=
  10. for /f %%c in ('type "!file0!"')  DO (
  11.     set x=!x!%%c
  12. )
  13. for %%c in (!x!) do (
  14.     echo !x!=!%%c!
  15.     call "!path1!\!%%c!"
  16. )
  17. pause
复制代码

作者: szwp    时间: 2024-5-2 09:13
窄口牛 发表于 2024-5-1 07:20
哦,看错了,标签是运行bat。

set /a w=(0x%v:~,1%-0xa)*2+0x%v:~1%-0xb
作者: 香国妙手    时间: 2024-5-2 15:58
dos时代菜鸟 发表于 2024-5-1 23:26

妙不可言!感谢大神的热心帮助!

再次请教大神:我想把call命令改为goto命令,这样一个bat文件就可以搞定了。请问怎样才能实现?

麻烦您了!

我其实是一名初二的学生,这几天放假了,是用我爸的账号发帖求助的。论坛前辈才高八斗,学富五车,我等后生小辈真是大开眼界,受益匪浅!感谢无忧论坛!感谢各位叔伯大神!
作者: dos时代菜鸟    时间: 2024-5-2 16:14
本帖最后由 dos时代菜鸟 于 2024-5-2 16:16 编辑
香国妙手 发表于 2024-5-2 15:58
妙不可言!感谢大神的热心帮助!

再次请教大神:我想把call命令改为goto命令,这样一个bat文件就可以 ...
用 goto 不如用 call 调取脚本内部函数。 结构 与goto 差不多 只是 每段 结尾 加个 exit /b  


  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. set "path1=D:\666"
  4. set "file0=!path1!\000.txt"

  5. set  x=
  6. for /f %%c in ('type "!file0!"')  DO (set x=!x!%%c)
  7. CALL :!X!

  8. pause
  9. goto :eof

  10. :ac
  11. echo AC
  12. EXIT /B

  13. :AD
  14. ECHO AD
  15. EXIT /B

  16. :BC
  17. ECHO BC
  18. EXIT /B

  19. :BD
  20. ECHO BD
  21. EXIT /B
复制代码

作者: 香国妙手    时间: 2024-5-2 19:01
dos时代菜鸟 发表于 2024-5-2 16:14
用 goto 不如用 call 调取脚本内部函数。 结构 与goto 差不多 只是 每段 结尾 加个 exit /b

已拜读,学习了!
感恩无忧,感谢有您!


作者: softwarezheng    时间: 2024-5-4 09:14
感谢大神
作者: cxincn    时间: 2024-5-19 18:40

学无止境.又学到东西了
作者: 贺云飞2    时间: 2024-5-28 08:24
太牛了,膜拜




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3