Board logo

标题: [系统相关] 【已解决】批处理如何有效判断自身已经被运行? [打印本页]

作者: noender    时间: 2019-1-23 09:12     标题: 【已解决】批处理如何有效判断自身已经被运行?

本帖最后由 noender 于 2019-1-23 14:46 编辑

有什么办法。可以判断自身批处理已经被运行呢。。。比如说,,,我有一个A批处理,,,运行过程中,,,我又双击了A这个批处理,结果。。它又被打开一个新窗口运行了,,这样就出现了一个相同的程序在同时运行的情况,我利用判断进程是可能 做到。。A批处理已经存在并运行的提示,,但是如果是改了这个A的文件名,,,再双击运行。。这样一来。。这个判断进程就失败了。。。。有什么好办法可以直接判断已经运行吗。。。。请大神帮助一下。。谢谢。
作者: Batcher    时间: 2019-1-23 09:18

代码开头先判断一下脚本的名称,比如一旦发现脚本不是 bathome.bat 就直接退出。
作者: noender    时间: 2019-1-23 09:38

回复 2# Batcher


    判断名字是指判断这个批处理文件名吗。???大神不太理解你指的意思是什么。。。哪还是要用判断进程来操作的吗。。
作者: noender    时间: 2019-1-23 09:39

回复 2# Batcher


    就是我上面说的哪样。如何是判断这个进程 中。是不是存在这个批处理的名字来操作的话。是可以实现。但是万一改了这个程序名。就一样是可以运行的。所以没有什么招了。。你的方法我不懂呀。。能说的具体一些的吗。主要是思路没有搞明白。
作者: noender    时间: 2019-1-23 10:05

  1. @echo off
  2. set name=%~n0
  3. if "%name%"=="3" (
  4. echo 对
  5. ) else (
  6. echo 错
  7. )
  8. pause
复制代码
回复 2# Batcher


大神你的意思。是不是这样操作呢。
作者: noender    时间: 2019-1-23 10:10

上面的操作过后。还是需要判断进程 。。这样是可以处理了。
作者: WHY    时间: 2019-1-23 10:40

句柄占用
  1. @echo off 2>nul 3>>"%~f0"
  2. type "%~f0"
  3. pause
复制代码

作者: 老刘1号    时间: 2019-1-23 11:13

wmic process where name='cmd.exe' get commandline /value
然后判断就行了

这个命令还可以直接得到打包批处理自解压出来的bat路径
作者: noender    时间: 2019-1-23 11:49

回复 8# 老刘1号


    好的。我试试。。看看。。。。谢谢了。
作者: zhangzsky    时间: 2019-1-23 14:16

  1. tasklist /fi "windowtitle eq Batch-Name*" 2>nul|find /i "PID" && exit
  2. rem 避免重复运行
  3. title Batch-Name
复制代码

作者: noender    时间: 2019-1-23 14:38

回复 10# zhangzsky


    你的代码我测试了。一样可以打开的。不管我是不是改文件名。都是可以的。相同的也是可以的。
作者: noender    时间: 2019-1-23 14:40

回复 10# zhangzsky


    没有达到效果。。。不知道是不是我操作不对。
作者: noender    时间: 2019-1-23 14:46

句柄占用
WHY 发表于 2019-1-23 10:40



    此命令是可以有效实现,,同一个文件名,运行第二次的时候。直接提示已经被运行。。太谢谢你了。
作者: Batcher    时间: 2019-1-23 14:47

回复 6# noender


    是的,我的意思就是先判断批处理文件的名字,再结合你原来判断进程名的方法。
作者: ygqiang    时间: 2019-1-23 15:16

回复 1# noender


    最终解决代码是?发出来看看,谢谢
作者: noender    时间: 2019-1-24 11:01

回复 15# ygqiang


    上面已经写了呀。就是我发的一部分与。上面的大神发的。我有回复的。
作者: noender    时间: 2019-1-24 11:02

回复 7# WHY


    大神。但是碰到了一个寄怪的问题。就是你的这个代码。。如果是BAT测试是可以正常达到效果的。。但是如果是。。BAT TO EXE后。就不会判断了。。这个是为什么。。寄怪了。
作者: zhangzsky    时间: 2019-1-24 13:13

本帖最后由 zhangzsky 于 2019-1-24 13:16 编辑

回复 17# noender
  1. tasklist /fi "windowtitle eq Batch-Name*" 2>nul|find /i "PID" && exit
  2. rem 避免重复运行
  3. title Batch-Name
复制代码
第一行是搜索标题叫batch-name的pid,有就退出
第二行是设置自己的标题batch-name
该批处理没有运行自然不存在这个标题,如果已经运行了。就退直接退出。这样来达到避免重复运行的效果。
如果你另行设置标题栏,这个自无效的。文件名,句柄,标题如果都还没解决……
我也不知道是不是我表达的不清晰,还是看错题了^_^
作者: noender    时间: 2019-1-24 14:04

回复 18# zhangzsky


    大神,你好。。。你的这个意思。我也有理解过。。但是你需要用到一个文件去判断另一个文件才有效的吧。。。。因为我想在同一个文件中写入语句。达到。。被重复打开的问题。。。
  1. @echo off 2>nul 3>>"%~f0"
  2. type "%~f0"
  3. pause
复制代码
这个代码的大神,是可以实现自个判断的。。比如A.bat双击运行后,,,,你再一次去双击运行这个A.BAT的话。哪就会有提示,说相同的文件已经在运行了。。。哪就直接不让重复运行。。。但是这个BAT转EXE后。。这个命令就失效了。哎。
作者: noender    时间: 2019-1-24 14:05

回复 18# zhangzsky


    同一个文件内容中。如果写入你的语句。。是不是被。运行就被退出呢。因为一运行。就自个判断PID已经存在了。
作者: Batcher    时间: 2019-1-24 14:32

回复 19# noender


    exe执行之后,你去临时文件夹目录下面找找,应该会释放一个bat文件,打开那个文件看看代码开头是不是被加了一行
作者: Batcher    时间: 2019-1-24 14:34

回复 20# noender


    不是的。因为先执行tasklist后执行title
作者: noender    时间: 2019-1-24 15:10

回复 10# zhangzsky


    大神。。但是我试过了呢。。还是一样。。打一个比方。。你的这个代码。弄下来。双击运行它。。给他了一个等待。。但是。我再一次双击运行它。。。一样是可以打开两个一样的批处理的呀。
作者: noender    时间: 2019-1-24 15:12

回复 7# WHY


    @echo off 2>nul 3>>"%~f0"
type "%~f0"
pause

这个代码是可以实现地的。。只不过转成EXE不行。。。我原来的自个是想用,,一个文件。去判断主批处理的PID来实现的。。这样就是多了一个批处理。。。觉得不好。。。所以。。看看。能不能在同一个批处理头上。加上一些语句能来实现。判断不被重复运行。。
作者: noender    时间: 2019-1-24 15:13

回复 10# zhangzsky


    @echo off 2>nul 3>>"%~f0"
type "%~f0"
pause

这个可以实现在。转EXE不行。。我是菜鸟。。所以想请你说一下。你的代码。要怎么实现呢。
作者: noender    时间: 2019-1-24 15:14

回复 21# Batcher


    如果是被加了一行。。哪和这个 有关系。???哪这个是自动生成的。。后续也拿不掉呀。。。有办法吗的。大神。
作者: noender    时间: 2019-1-24 18:14

tasklist /fi "windowtitle eq Batch-Name*" 2>nul|find /i "PID" && exit
rem 避免重复运行
title Batch-Name
总于弄清楚为什么不能运行了。。原来title   在win10下,只能是写上管理员这几个字的。不然的话不会判断。都是失效。。
作者: noender    时间: 2019-1-25 09:22

最终的解决代码是
  1. tasklist /fi "windowtitle eq 管理员*" 2>nul|find /i "cmd" && exit
  2. rem 避免重复运行
  3. title 管理员
复制代码
zhangzsky  大神提供的码。。只需更改上面的的字就行了。。而且这个可以有效的处理相同的进程被重复运行,,也不需要再去判断这个文件名了,,一具二得的。在WIN7与WIN10下测试都是可以的。转成EXE也是可以的。。真的是太好了。再一次感谢所有帮助过的各位大神。。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2