[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]求助:同一bat复用避免冲突问题

本帖最后由 hlzj88 于 2023-9-28 21:46 编辑
  1. @echo off
  2. :ks
  3. copy /y 1.html 2.html
  4. if exist ..\标志2.ini goto ks
  5. if exist ..\标志3.ini goto ks
  6. echo,>>..\标志1.ini
  7. htox32c /IP /O0 /U1+4 2.html
  8. del /q 2.html
  9. del /q ..\标志1.ini
  10. echo 其他语句
  11. if exist *.html goto ks
复制代码
要复用的代码构造框架思路如上,因为效率问题计划把该bat复制到三个文件夹(wjj1 wjj2 wjj3)下,由另外bat分配文件并都(或者手动)启动他们加快处理文件。因hto32c不允许同时运行,会有同时运行的情况出现,导致暂停,结果出错现象。
由此,想令 在(wjj1 wjj2 wjj3)不同文件夹下运行运行时,产生可以彼此区分的标志,当其中一个运行到启动hto32c前,现检测上级文件夹是否有其他标志来暂缓自己启动hto32c时间,直到没有标志存在,自己就继续运行。

因为bat较大,不想同时保存三个。所以,求助,同一bat,运行时如何产生一个独有标志,并能被另外运行的同一源码的bat检测到。同时运行三个,应当有3个可以互相检测的标志。
另,假设 wjj1 下文件处理完毕停止运行,又添加进新html再次启动,产生的标志依据能被另外两个识别到。

自己思考了几个方案,都不能避免冲突现象,特此求助论坛大佬,希望能给出解决方法。

假如采用上面代码测试,容易因1.html是固定大小的,因此彼此运行间隔也统一。会虚假的不会冲突。

原始问题是这样,谢谢大家,
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
目的,学习批处理

  1. @echo off 2>con 3>&2 4>>%0
  2. echo single instance batch
  3. echo http://demon.tw
  4. pause
复制代码
不知道这个你适用不
防止批处理重复运行

QQ 20147578

TOP

回复 2# czjt1234
谢谢。代码不能达到效果。。需要的是bat可以运行,但内含的exe启动要互相避让。
目的,学习批处理

TOP

回复 1# hlzj88
  1. :WaitLock
  2. if exist "..\file.lock" (
  3.     echo Wait ..\file.lock to be deleted
  4.     timeout /t 1 /nobreak >nul
  5.     goto :WaitLock
  6. )
  7. type nul >"..\file.lock"
  8. htox32c /IP /O0 /U1+4 2.html
  9. del /f /q "..\file.lock"
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 4# Batcher
坛主意思是复用几个都只检测同一个文件。
想了想,也许这是最佳办法。反而变不复杂了。
目的,学习批处理

TOP

经加入试运行,还是会出现冲突现象。也许瞬间两个同时启动,在毫秒之间。无法避免。
结帖
目的,学习批处理

TOP

  1. @echo off
  2. :loop
  3. set str=%random%%random%%random%
  4. if exist "htox32c.exe" (
  5. ren "htox32c.exe" "htox32c%str%.exe" 2>nul
  6. )
  7. if exist "htox32c%str%.exe" (
  8. "htox32c%str%.exe" /IP /O0 /U1+4 2.html
  9. ) else (
  10. timeout 1 >nul
  11. goto :loop
  12. )
  13. ren "htox32c%str%.exe" "htox32c.exe"
复制代码

把exe改个名字,这样可以吗
bat小白,请多指教!谢谢!

TOP

回复 6# hlzj88


    循环内部生成一个1到5之间的随机数,执行exe之前随机延时1~5秒。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

TOP

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

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


通读了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

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

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

QQ 20147578

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

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

回复 12# aloha20200628

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

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

TOP

返回列表