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

[文本处理] (已解决)bat脚本中如何显示正在运行的程序数量?

[复制链接]
发表于 2024-4-23 17:33:25 | 显示全部楼层 |阅读模式
本帖最后由 xfgc 于 2024-4-25 15:49 编辑

各位大佬们,想咨询一下,bat是否能实现如下功能,1.计算正在运行的特定程序的数量;2.当运行程序的数量小于某一值(比如 40 )时,自动运行下一个程序,直到满足运行程序的数量为40
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. call fds

  4. set filnavn1=1.fds
  5. set mappenavn1="1"
  6. set path1=%mappenavn1%

  7. set filnavn2=2.fds
  8. set mappenavn2="2"
  9. set path2=%mappenavn2%

  10. set filnavn3=3.fds
  11. set mappenavn3="3"
  12. set path3=%mappenavn3%

  13. set filnavn4=4.fds
  14. set mappenavn4="4"
  15. set path4=%mappenavn4%


  16. if not exist "%path1%" mkdir %path1%
  17. copy %filnavn1% %path1%

  18. if not exist "%path2%" mkdir %path2%
  19. copy %filnavn2% %path2%

  20. if not exist "%path3%" mkdir %path3%
  21. copy %filnavn3% %path3%

  22. if not exist "%path4%" mkdir %path4%
  23. copy %filnavn4% %path4%

  24. cd %mappenavn1%
  25. start cmd /k call fds_local -p 4 %filnavn1%
  26. cd..

  27. cd %mappenavn2%
  28. start cmd /k call fds_local -p 4 %filnavn2%
  29. cd..

  30. rem 定义包含 fds 文件的文件夹列表
  31. set "folders=Folder1 Folder2 Folder3 Folder4"

  32. REM 设置特定程序名称
  33. set program_name=fds.exe

  34. REM 设置计数器
  35. set /a count=0

  36. REM 遍历 tasklist 输出的每一行
  37. for /f "skip=3 tokens=1" %%a in ('tasklist ^| findstr /i /c:"%program_name%"') do (
  38.     REM 如果行不为空,则增加计数器
  39.     if not "%%a"=="" (
  40.         set /a count+=1
  41.     )
  42. )

  43. REM 如果特定程序的数量小于8,则启动下一个程序
  44. if %count% LSS 8 (
  45. rem 获取下一个未运行的 fds 文件
  46.     for %%i in (%folders%) do (
  47.         cd "%%i"
  48.         for %%j in (%fds_files%) do (
  49.             tasklist  | findstr /i "fds.exe" > nul
  50.             if errorlevel 1 (
  51.                 rem 启动下一个 fds 文件任务
  52.                 start cmd /c call fds_local -p 4 %%i.fds
  53.                 goto :next_file
  54.             )
  55.         )
  56.         cd ..
  57.     )
  58. )


  59. :next_file
  60. rem 等待一段时间后继续检查
  61. timeout /t 5
  62. goto start

  63. rem 如果没有正在运行的 fds,则显示 "All simulations completed." 并暂停脚本
  64. echo All simulations completed.
  65. pause
  66. exit

复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2024-4-23 22:00:36 | 显示全部楼层
请直接完整描述下需求,像顶楼的两点,我觉得ai也没必要写86行吧...

评分

参与人数 1技术 +3 收起 理由
xfgc + 3 非常强,十分感谢

查看全部评分

发表于 2024-4-24 08:28:45 | 显示全部楼层
回复 1# xfgc


能否举例说明这段代码跟你的需求之间有什么关联或者差距?
如果需要上传文件,请用使用网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
 楼主| 发表于 2024-4-24 17:40:05 | 显示全部楼层
回复 2# 77七
想要实现的功能放在了百度网盘里面,恳请各位大佬赐教,纯小白,上面的代码都是一点一点搜出来写的
链接:https://pan.baidu.com/s/13la4gk2MY8PDnl_Xjo6gAA?pwd=1234
提取码:1234
 楼主| 发表于 2024-4-24 17:41:27 | 显示全部楼层
回复 3# Batcher
感谢您提供的上传方法,想要实现的功能放在了百度网盘里面,恳请各位大佬赐教,纯小白,上面的代码都是一点一点搜出来写的
链接:https://pan.baidu.com/s/13la4gk2MY8PDnl_Xjo6gAA?pwd=1234
提取码:1234
发表于 2024-4-24 18:27:54 | 显示全部楼层
回复 4# xfgc


  
  1. @echo off
  2. cd /d "%~dp0"
  3. :loop
  4. for /f %%a in ('tasklist ^|find /i /c "fds.exe"') do (
  5.         if %%a lss 40 (
  6.                 call :1
  7.         ) else (
  8.                 timeout 5 >nul
  9.                 goto :loop
  10.         )
  11. )
  12. if not defined m (
  13.         echo All simulations completed.
  14.         pause
  15.         exit
  16. ) else (
  17.         timeout 1 >nul
  18.         goto :loop
  19. )

  20.         :1
  21.         set m=
  22.         for /r %%i in (*.fds) do (
  23.                 if not defined _"%%i" (
  24.                         set _"%%i"=1
  25.                         set m=1
  26.                         start cmd /k call fds_local -p 4 "%%i"
  27.                         exit /b
  28.                 )
  29.         )
  30.         exit /b
复制代码
发表于 2024-4-24 19:36:02 | 显示全部楼层
本帖最后由 aloha20200628 于 2024-4-25 15:45 编辑


“...目前想要实现的功能是,我需要跑50个fds.exe文件,假设我的电脑有40核,我只能同时跑10个fds.exe文件,希望通过这个代码可以实现这50个fds.exe文件自动跑完:当每次运行的10个fds.exe文件中的其中1个运行结束之后,后面的fds.exe文件可以自动运行,保证一直都是10个fds.exe文件在跑,直到50个全部跑完...”

以下代码根据以上条件和要求。代码存为test.bat,放到fds.exe文件所在目录运行


  1. @echo off &setlocal enabledelayedexpansion
  2. set/a "n=0,k=0"
  3. :[loop]
  4. if !k! lss 10 (start "" fds.exe &set/a "n+=1")
  5. if !n! geq 50 goto[end]
  6. timeout /t 5
  7. for /f %%k in (' tasklist^|find /c /i "fds.exe" ') do set "k=%%k"
  8. goto[loop]
  9. :[end]
  10. echo,All simulations completed
  11. exit/b
复制代码
 楼主| 发表于 2024-4-25 14:50:18 | 显示全部楼层
回复 6# 77七
十分感谢大佬,该问题已经差不多被解决了,现在只有一个小问题,就是 fds.exe运行的时候是在根目录运行,不是在单独的文件夹里面运行,因为一个fds文件运行产生的其他文件非常多,希望能实现fds文件在各自的文件夹中运行。再次感谢您解决了我的难题。以下是bat代码的说明和示例:
链接:https://pan.baidu.com/s/1Itw47oPJ0WaF8evCpW4BNA?pwd=1234
提取码:1234
 楼主| 发表于 2024-4-25 14:51:05 | 显示全部楼层
回复 7# aloha20200628
感谢您的回复,目前问题已经差不多被解决了,现在只有一个小问题,就是 fds.exe运行的时候是在根目录运行,不是在单独的文件夹里面运行,因为一个fds文件运行产生的其他文件非常多,希望能实现fds文件在各自的文件夹中运行。再次感谢您的帮助。以下是bat代码的说明和示例:
链接:https://pan.baidu.com/s/1Itw47oPJ0WaF8evCpW4BNA?pwd=1234
提取码:1234
发表于 2024-4-25 15:27:45 | 显示全部楼层
回复 8# xfgc


    修改第21-31行为:
  1.         :1
  2.         set m=
  3.         for /r %%i in (*.fds) do (
  4.                 if not defined _"%%i" (
  5.                         set _"%%i"=1
  6.                         set m=1
  7.                         md "%%~ni"
  8.                         pushd "%%~ni"
  9.                         start cmd /k call fds_local -p 4 "%%i"
  10.                         popd
  11.                         exit /b
  12.                 )
  13.         )
  14.         exit /b
复制代码

 楼主| 发表于 2024-4-25 15:43:30 | 显示全部楼层
回复 10# 77七
非常非常感谢大佬,问题已经完全解决!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 01:20 , Processed in 0.024060 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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