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

[文件操作] 如何限制批处理的启动次数

比如我要开启一个程序脚本,那么在进程中就会有一个cmd.exe的进程
这个进程是属于我这个脚本的,那么问题来了
如果只能打开一个cmd.exe,我的意思就是说,只能打开一个批处理脚本
因为有时候我打开了,最小化,放在任务栏中,有时候不知道已经开启了,我就会再次打开一个
这样时间长了,就会打开很多很多的批处理,我不想这样

在帖子中我发现了一个代码,但是是限制自身的二次开启,和我的有的一样,我的是限制批处理格式的脚本二次开启(cmd.exe)

另附上源代码,以供分析之用:
  1. @echo off
  2. %1 %0 : 3>>%0||exit
  3. echo 运行过程中无法启动第二个此脚本
  4. pause
复制代码

回复 1# GAGATOSHUT


    如果=如何

TOP

本帖最后由 pcl_test 于 2015-1-25 14:00 编辑

回复 1# GAGATOSHUT
请以管理员身份运行该批处理,因为需写入注册表,如果被杀软拦截,请选择允许运行或先退出杀软
  1. @echo off
  2. reg delete "HKCR\.bat" /f >nul
  3. echo 已无法运行其他bat文件!
  4. echo 按任意键将结束并恢复正常&pause>nul
  5. reg add "HKCR\.bat" /ve /t REG_SZ /d "batfile" /f >nul
  6. exit
复制代码

TOP

回复 3# pcl_test


    首先谢谢你的回复,你的代码我运行后,还是能开启第二个批处理文件,你看看是否还有其他办法

TOP

回复 4# GAGATOSHUT
嗯,只针对双击打开bat有效

TOP

本帖最后由 pcl_test 于 2015-1-25 17:40 编辑

回复 4# GAGATOSHUT
这个是直接禁止cmd.exe再运行
  1. @echo off
  2. reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\cmd.exe" /v "Debugger" /t REG_SZ /d "C:\\cmdtemp.exe" /f >nul
  3. echo 已无法运行cmd.exe!
  4. echo 按任意键将结束并恢复正常&pause>nul
  5. reg delete "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\cmd.exe" /f >nul
  6. exit
复制代码
1

评分人数

    • GAGATOSHUT: 试运行可以,但是如果程序紧急关闭,可能面临 ...技术 + 1

TOP

  1. @echo off
  2. for /f "skip=2 tokens=*" %%i in ('wmic process where name^="cmd.exe" get Commandline ^|findstr "%~nx0"') do (
  3. set jud=%%i
  4. if defined jud exit
  5. )
  6. pause
  7. rem 只能同时运行skip-1个CMD
复制代码
以前写过一个..
1

评分人数

    • yu2n: 推荐,VBS 同样方法。技术 + 1

TOP

本帖最后由 再世情緣 于 2015-1-25 19:13 编辑
  1. @echo off&set /a "i=0"
  2. for /f "tokens=1,2" %%a in ('tasklist /v /nh /fi "imagename eq cmd.exe" 2^>nul') do (
  3.   echo.[ %%a ]    [ %%b ]
  4.   set /a "i=+1"
  5. )
  6. echo.当前 CMD 进程数 [ %i% ]
  7. pause.
复制代码
为毛明明我只打开了一次,却获取到2个CMD进程,但是,在任务管理器里只有一个CMD进程啊。。
再次打开,获取到3个CMD进程,与上个窗口对比,只有一个CMD ID一样。。。

TOP

回复 8# 再世情緣


    for /f "tokens=1,2" %%a in ('tasklist /v /nh /fi "imagename eq cmd.exe" 2^>nul') do ...
这里实际上是从 cmd /c tasklist /v /nh /fi "imagename eq cmd.exe" 2^>nul 的输出中获取输入的,所以会有两个 cmd.exe

TOP

回复 9# CrLf


    哦。。。谢谢了。。

TOP

这个需求太诡异了
无非先判断再创建和判断重复则杀掉两种思路,想过去只有几种做法:
1、autoexec.bat 判断是否有多个 cmd.exe
2、将 cmd 改名为 隐藏boss.exe,映像劫持 cmd.exe 到一个脚本中判断不存在 隐藏boss.exe 进程则执行 隐藏boss.exe
3、开机运行一个程序循环监控是否存在cmd进程,存在多个 cmd.exe 则将新增的 cmd 结束
4、劫持进程创建,或在系统关键 dll 中篡改 createprocess 等函数

TOP

本帖最后由 tmplinshi 于 2015-1-25 22:52 编辑

我以前收藏的两个代码:(具体是什么意思不要问我,我也不知道。)
  1. :: http://demon.tw/reverse/cmd-internal-redirect.html
  2. @echo off 2>con 3>&2 4>>%0
  3. echo single instance batch
  4. echo http://demon.tw
  5. pause
复制代码
  1. :: http://www.enun.net/?p=1419
  2. @echo off
  3. %1 %0 : 3>>%0
  4. pause
复制代码

TOP

本帖最后由 CrLf 于 2015-1-26 00:27 编辑

回复 12# tmplinshi


    我去,这些人转载都当作原创的么...
http://bbs.bathome.net/viewthread.php?tid=16369
原理见6楼
记得 demon 有个不用 exit 的版本,没找到,依稀记得和句柄备份有关,不知道会不会是像这样:
  1. @echo off 2>nul 3>nul 4>>%0
  2. dir
  3. pause
复制代码

TOP

返回列表