无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 1069|回复: 31
打印 上一主题 下一主题

求一个批处理,不胜感激!

[复制链接]
跳转到指定楼层
1#
发表于 2024-4-30 09:58:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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

恳请赐教,不胜感激!

2#
发表于 2024-4-30 10:10:21 | 只看该作者
  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
复制代码

点评

2楼这个批处理的问题在于获取000.txt内容时看错了题意,按他的代码,AC组合是在一行上,而且,中间有分隔符,实际上000.txt有两行内容,类似这样: A C 所以,他的代码无法获取line1和line2的内容。稍微改一下:  详情 回复 发表于 2024-4-30 11:45
感谢您的热心解答!刚才测试了一下,不管我如果修改000.txt的内容,比如:AC,AD,BC,BD,当然也只有这4种情况,但结果都是运行了004.bat 能否买麻烦您重新修改一下?谢谢!  详情 回复 发表于 2024-4-30 11:17
好人  发表于 2024-4-30 10:54

评分

参与人数 1无忧币 +2 收起 理由
yyz2191958 + 2 赞一个!

查看全部评分

回复

使用道具 举报

3#
发表于 2024-4-30 11:04:08 | 只看该作者
很绕口的哈,
回复

使用道具 举报

4#
 楼主| 发表于 2024-4-30 11:17:06 | 只看该作者

感谢您的热心解答!刚才测试了一下,不管我如何修改000.txt的内容,比如:AC,AD,BC,BD,当然也只有这4种情况,但结果都是运行了004.bat
能否买麻烦您重新修改一下?谢谢!
回复

使用道具 举报

5#
发表于 2024-4-30 11:25:28 | 只看该作者
学习。。。
回复

使用道具 举报

6#
发表于 2024-4-30 11:45:23 | 只看该作者

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 13:19
好人  发表于 2024-4-30 12:11
感谢Climbing大神! 完美实现预期效果!  详情 回复 发表于 2024-4-30 11:52

评分

参与人数 1无忧币 +2 收起 理由
yyz2191958 + 2 赞一个!

查看全部评分

回复

使用道具 举报

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

感谢Climbing大神!
完美实现预期效果!
回复

使用道具 举报

8#
发表于 2024-4-30 11:56:19 | 只看该作者
问了一下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
复制代码
回复

使用道具 举报

9#
发表于 2024-4-30 12:13:01 | 只看该作者
学习了!!
回复

使用道具 举报

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

谢谢分享
回复

使用道具 举报

11#
发表于 2024-4-30 13:38:19 | 只看该作者
感谢天地,感恩有你
回复

使用道具 举报

12#
发表于 2024-4-30 13:47:39 | 只看该作者
感谢大佬们的精彩答复,学习了
回复

使用道具 举报

13#
发表于 2024-4-30 14:06:07 | 只看该作者
问了下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

回复

使用道具 举报

14#
发表于 2024-4-30 14:14:06 | 只看该作者
坐等
回复

使用道具 举报

15#
发表于 2024-4-30 14:18: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
依次类推。

点评

每个标签都必须加一个跳出语句,否则会把所有标签轮流执行一次。  详情 回复 发表于 2024-5-1 00:16
大神的批处理简洁有力,完美实现预期效果! 非常感谢!膜拜大神! 晚生还想请教一下:如果把call换成goto命令,应该怎样操作? 打扰您了,谢谢!  详情 回复 发表于 2024-4-30 19:55
回复

使用道具 举报

16#
发表于 2024-4-30 15:27:17 | 只看该作者
学习了!
回复

使用道具 举报

17#
发表于 2024-4-30 15:34:02 | 只看该作者
有大神在,放心学习。
回复

使用道具 举报

18#
发表于 2024-4-30 17:17:26 | 只看该作者
进来学习
回复

使用道具 举报

19#
发表于 2024-4-30 17:19:55 | 只看该作者
13楼和15楼的实现都非常巧妙,学习了。
回复

使用道具 举报

20#
 楼主| 发表于 2024-4-30 19:55:08 | 只看该作者
本帖最后由 香国妙手 于 2024-4-30 20:24 编辑
hilsonma 发表于 2024-4-30 14:18
如果000.txt的内容确实如同楼主描述的话,可以简化批如下:


点评

直接在下面添加 :001 即可 不用麻烦您了,谢谢!  详情 回复 发表于 2024-4-30 20:23
回复

使用道具 举报

21#
 楼主| 发表于 2024-4-30 20:23:44 | 只看该作者
本帖最后由 香国妙手 于 2024-4-30 20:43 编辑


回复

使用道具 举报

22#
发表于 2024-5-1 07:03:49 来自手机 | 只看该作者
窄口牛 发表于 2024-5-1 00:16
每个标签都必须加一个跳出语句,否则会把所有标签轮流执行一次。

没call不会回来了
回复

使用道具 举报

23#
发表于 2024-5-1 07:04:21 来自手机 | 只看该作者
窄口牛 发表于 2024-5-1 00:16
每个标签都必须加一个跳出语句,否则会把所有标签轮流执行一次。

没call不会回来了

点评

哦,看错了,标签是运行bat。  详情 回复 发表于 2024-5-1 07:20
回复

使用道具 举报

24#
发表于 2024-5-1 07:20:45 来自手机 | 只看该作者
szwp 发表于 2024-5-1 07:04
没call不会回来了

哦,看错了,标签是运行bat。

点评

set /a w=(0x%v:~,1%-0xa)*2+0x%v:~1%-0xb  详情 回复 发表于 2024-5-2 09:13
回复

使用道具 举报

25#
发表于 2024-5-1 23:26:39 | 只看该作者
本帖最后由 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
复制代码

点评

妙不可言!感谢大神的热心帮助! 再次请教大神:我想把call命令改为goto命令,这样一个bat文件就可以搞定了。请问怎样才能实现? 麻烦您了! 我其实是一名初二的学生,这几天放假了,是用我爸的账号发帖求  详情 回复 发表于 2024-5-2 15:58
回复

使用道具 举报

26#
发表于 2024-5-2 09:13:40 | 只看该作者
窄口牛 发表于 2024-5-1 07:20
哦,看错了,标签是运行bat。

set /a w=(0x%v:~,1%-0xa)*2+0x%v:~1%-0xb
回复

使用道具 举报

27#
 楼主| 发表于 2024-5-2 15:58:58 | 只看该作者

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

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

麻烦您了!

我其实是一名初二的学生,这几天放假了,是用我爸的账号发帖求助的。论坛前辈才高八斗,学富五车,我等后生小辈真是大开眼界,受益匪浅!感谢无忧论坛!感谢各位叔伯大神!
回复

使用道具 举报

28#
发表于 2024-5-2 16:14:54 | 只看该作者
本帖最后由 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
回复

使用道具 举报

29#
 楼主| 发表于 2024-5-2 19:01:31 | 只看该作者
dos时代菜鸟 发表于 2024-5-2 16:14
用 goto 不如用 call 调取脚本内部函数。 结构 与goto 差不多 只是 每段 结尾 加个 exit /b

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

回复

使用道具 举报

30#
发表于 2024-5-4 09:14:03 | 只看该作者
感谢大神
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-18 12:50

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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