[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 老刘1号 于 2023-9-28 10:54 编辑

回复 20# aloha20200628


    计算机世界中不要轻易说 “不能”
否则只会暴露自己的无知
进程之间本身就是独立的,文件的独立也可以通过文件名最后附加不同的随机数实现
共享资源还需要预测时间?真是滑天下之大稽
但凡系统学过一点并发编程都说不出这话
这东西和语言也没有直接关系,py的多线程支持也是一坨*
甚至语言层面都是跑在一个核上的,最近的标准才准备扔掉这个特性

TOP

本帖最后由 老刘1号 于 2023-9-28 11:24 编辑

回复 4# Batcher


    完全错误的锁实现
多个线程都有同时执行到第七行的可能

并发问题,无非上锁或者生产者消费者统一调度

TOP

回复 16# hlzj88

是说用新的bat来专门管理.不是让各自的bat来
管理bat
  1. @echo off
  2. set b=1
  3. set "ph1=wjj1"
  4. set "ph2=wjj2"
  5. set "ph3=wjj3"
  6. start "%ph1%\aaa.bat"
  7. start "%ph2%\aaa.bat"
  8. start "%ph3%\aaa.bat"
  9. :a
  10. cd.>"%ph1%\标志.ini"
  11. call set a=%%b%%
  12. goto :b
  13. :b
  14. if exist "%ph1%\标志.ini" goto :b
  15. cd.>"%ph2%\标志.ini"
  16. call set a=%%b%%
  17. goto :c
  18. :c
  19. if exist "%ph2%\标志.ini" goto :c
  20. cd.>"%ph3%\标志.ini"
  21. call set a=%%b%%
  22. goto :d
  23. :d
  24. call set a=%%b%%
  25. if exist "%ph3%\标志.ini" goto :d
  26. goto :a
复制代码
aaa.bat
  1. @echo off
  2. :ks
  3. copy /y 1.html 2.html
  4. if not exist ..\标志.ini goto ks
  5. htox32c /IP /O0 /U1+4 2.html
  6. del /q 2.html
  7. del /q ..\标志.ini
  8. echo 其他语句
  9. if exist *.html goto ks
复制代码

TOP



n个批处理脚本都在运行,其都要调用的abc.exe又不能被并行或重叠运行(无论abc.exe被更名与否) — 那么稳妥可靠的解决方案就是如何动态规划abc.exe的顺序运行,但遗憾的是,简单的批处理脚本没有多个并行进程之间的"隔离保护"或"相互防干扰"功能,故只能被允许静态顺序运行abc.exe,例如每个批处理脚本中在abc.exe之前的流程A可用并行方法提速,直到各个脚本中的A流程全部完成,再顺序运行n次abc.exe,然后各个批处理脚本的后续流程再用并行方法提速完成。

如果不能用 start "" /b abc.exe ... 并发多个abc.exe进程(无论abc.exe被更名与否),也就很难用并行方法(无论何种途径)可靠运行多个包含abc.exe的批处理脚本,除非有精确模型能预算出每个脚本中abc.exe本身和之前流程的时耗以便动态规划。

我本人经历 '下载网页以及清洗网页' 的路径,是最终转向了Python。

TOP

回复 18# 77七
谢谢,才理解你的意思。这样的确是有道理。我稍后试试。
目的,学习批处理

TOP

回复 17# hlzj88


   我觉得你没理解代码的意思,只用一个 exe三个bat 全对这一个 exe 进行改名,即使三个bat同时改名,也应该只会成功一个吧,或者都不成功?反正不会存在,改名后多出一个exe 的情况。然后改名成功的,会执行操作,操作完毕改回原名,其它bat判断到存在原名的exe又会改名,这个我觉得100%不会存在两个exe同时操作的情况。
bat小白,请多指教!谢谢!

TOP

本帖最后由 hlzj88 于 2023-9-27 20:39 编辑

回复 11# 77七

三个文件夹,已预先改名hto32c.exe,令他们不同,测试bat内已不含随机数,反复改名语句,只强行转换html。结果冲突。
看来并非改名可以避免,而是在hto32c工作内部会冲突。
目的,学习批处理

TOP

回复 14# Five66
怪我描述不彻底。实际情况是一个bat里必须用一次hto32c,还有一次满足条件也用一次的情况。    况且bat是自循环,如果三个bat在一个文件夹内抢文件,产生临时文件,删除临时文件,可能会更乱。所以是安排三个文件夹让他们彼此不乱。
目的,学习批处理

TOP

本帖最后由 hlzj88 于 2023-9-27 19:37 编辑

回复 12# aloha20200628

我做了个结构化的网络小说整理为本地单网页工具,各个单独功能为一个bat部件。按流程调用。由此,单功能部件可为其他所调用,也可独立运行。也方便单独修改。

原来流程为只要开始下载网页就在一个文件夹内开始处理网页,因处理为文本的bat同时含有标点转换,非正常文字踢出,字符转换,段落重排版等功能,所以耗时较多,处理就慢。通常下载完还需要等很久文本。
以前也就速度有过优化,以我只略懂bat的能力感觉已无力再提速。也是最近才想进行并行处理。两个并行出错少,但依旧需要等待。三个并行速度才约等于下载速度。hto32c不能并行运行,会出现卡住需人工干预现象,才想办法令他不能同时运行。
大意如上。因此不能依次启动bat,bat已设计为自循环。只可在避免同时运行hto32c上下功夫。或者你们有更好合理的方案。
目的,学习批处理

TOP

新增一个bat.用于管理标志文件,不知行否
比如
  1. @echo off
  2. set b=1
  3. set "ph=d:\a"
  4. :s
  5. cd.>"%ph%\标志1.ini"
  6. call set a=%%b%%
  7. del "%ph%\标志1.ini" 2>nul
  8. cd.>"%ph%\标志2.ini"
  9. call set a=%%b%%
  10. del "%ph%\标志2.ini" 2>nul
  11. cd.>"%ph%\标志3.ini"
  12. call set a=%%b%%
  13. del "%ph%\标志3.ini" 2>nul
  14. goto :s
复制代码

TOP

计划把该bat复制到三个文件夹(wjj1 wjj2 wjj3)下

那是否可以新建个文本文档,把 wjj1 wjj2 wjj3 写进去,一行一个
然后批处理依次处理每行的文件夹名

QQ 20147578

TOP


通读了n遍一楼的大段'密文',未能破解其原意。
个人理解似乎是lz有一堆网页文件*.html,分置在三个目录中,要用一个网页转文本工具HtoX32c.exe,设法高效处理这三个目录...
本人所知的批处理脚本解决之道,有并发进程即并联方案,如
        start "" /b HtoX32c.exe ... d:\wjj1\*.html
        start "" /b HtoX32c.exe ... d:\wjj2\*.html
        start "" /b HtoX32c.exe ... d:\wjj3\*.html
如果并联方案不通,即HtoX32c.exe不能在并发进程中被同时运行,也许就只能采用通常的串行方案,如
        HtoX32c.exe ... d:\wjj1\*.html
        HtoX32c.exe ... d:\wjj2\*.html
        HtoX32c.exe ... d:\wjj3\*.html
除以上二者之外,看来lz是要探讨第三条路可否用批处理脚本提速...
关注此帖不断升高。

TOP

回复 10# hlzj88


   
exe只用一个,只有重命名成功的那个bat会执行操作,操作后会改回原名。然后循环下去。
set 随机数是疏忽了,以前听大佬说,大概是相同时间(可能以秒算),确实会产生相同的随机数,
那就放loop外面,打开bat时间隔1秒,确保3次的随机数不同。
  1. @echo off
  2. set str=%random%%random%%random%
  3. :loop
  4. if exist "d:\htox32c.exe" (
  5. ren "d:\htox32c.exe" "htox32c%str%.exe" 2>nul
  6. )
  7. if exist "d:\htox32c%str%.exe" (
  8. "d:\htox32c%str%.exe" /IP /O0 /U1+4 2.html
  9. ) else (
  10. timeout 1 >nul
  11. goto :loop
  12. )
  13. ren "d:\htox32c%str%.exe" "htox32c.exe"
复制代码



或者用一个bat带参数执行自身。
  1. @echo off
  2. %1 (for %%a in (1 2 3) do (start "" "%~f0" rem %%a))&exit
  3. if "%~2" equ "1" (
  4. pushd "d:\test1"
  5. ) else if "%~2" equ "2" (
  6. pushd "d:\test2"
  7. ) else if "%~2" equ "3" (
  8. pushd "d:\test3"
  9. ) else goto:eof
  10. set str=%~2
  11. :loop
  12. if exist "d:\htox32c.exe" (
  13. ren "d:\htox32c.exe" "htox32c%str%.exe" 2>nul
  14. )
  15. if exist "d:\htox32c%str%.exe" (
  16. "d:\htox32c%str%.exe" /IP /O0 /U1+4 2.html
  17. ) else (
  18. timeout 1 >nul
  19. goto :loop
  20. )
  21. ren "d:\htox32c%str%.exe" "htox32c.exe"
复制代码
bat小白,请多指教!谢谢!

TOP

用500+html 分别放入1 2 3 三个文件夹内,用for 语句启动他们,
回复 7楼  1 set str=%random%%random%%random%在loop内,导致处理没有txt产生,放外面能出现txt 。 2  三个文件夹里exe都命名为同一随机尾数exe,太晚,明天再修改试看看结果
回复 8楼  没有处理完,已经出现几次exe同时运行的错误。
目的,学习批处理

TOP

谢谢 7楼  8楼,我都再试试看。
目的,学习批处理

TOP

返回列表