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

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

[复制链接]
发表于 2015-1-25 10:38:59 | 显示全部楼层 |阅读模式
比如我要开启一个程序脚本,那么在进程中就会有一个cmd.exe的进程
这个进程是属于我这个脚本的,那么问题来了
如果只能打开一个cmd.exe,我的意思就是说,只能打开一个批处理脚本
因为有时候我打开了,最小化,放在任务栏中,有时候不知道已经开启了,我就会再次打开一个
这样时间长了,就会打开很多很多的批处理,我不想这样

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

另附上源代码,以供分析之用:
  1. @echo off
  2. %1 %0 : 3>>%0||exit
  3. echo 运行过程中无法启动第二个此脚本
  4. pause
复制代码
 楼主| 发表于 2015-1-25 10:40:20 | 显示全部楼层
回复 1# GAGATOSHUT


    如果=如何
发表于 2015-1-25 13:50:35 | 显示全部楼层
本帖最后由 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
复制代码
 楼主| 发表于 2015-1-25 15:07:44 | 显示全部楼层
回复 3# pcl_test


    首先谢谢你的回复,你的代码我运行后,还是能开启第二个批处理文件,你看看是否还有其他办法
发表于 2015-1-25 15:56:42 | 显示全部楼层
回复 4# GAGATOSHUT
嗯,只针对双击打开bat有效
发表于 2015-1-25 17:38:59 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
GAGATOSHUT + 1 试运行可以,但是如果程序紧急关闭,可能面临 ...

查看全部评分

发表于 2015-1-25 17:47:12 | 显示全部楼层
  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技术 +1 收起 理由
yu2n + 1 推荐,VBS 同样方法。

查看全部评分

发表于 2015-1-25 19:05:48 | 显示全部楼层
本帖最后由 再世情緣 于 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一样。。。
发表于 2015-1-25 21:58:50 | 显示全部楼层
回复 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
发表于 2015-1-25 22:06:26 | 显示全部楼层
回复 9# CrLf


    哦。。。谢谢了。。
发表于 2015-1-25 22:46:48 | 显示全部楼层
这个需求太诡异了
无非先判断再创建和判断重复则杀掉两种思路,想过去只有几种做法:
1、autoexec.bat 判断是否有多个 cmd.exe
2、将 cmd 改名为 隐藏boss.exe,映像劫持 cmd.exe 到一个脚本中判断不存在 隐藏boss.exe 进程则执行 隐藏boss.exe
3、开机运行一个程序循环监控是否存在cmd进程,存在多个 cmd.exe 则将新增的 cmd 结束
4、劫持进程创建,或在系统关键 dll 中篡改 createprocess 等函数
发表于 2015-1-25 22:49:41 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2015-1-26 00:11:31 | 显示全部楼层
本帖最后由 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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-19 21:35 , Processed in 0.021322 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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