![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-03 17:50 |
共 48,038 主题排行 / 350,123 发帖 / 今日 0 篇 / 48,251 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [讨论]编程中发现一个奇怪的问题 |
| 可打印版本 2,070 / 26 |
| 第1楼 quya | 发表于 2008-07-19 18:32 |
| 高级用户 发帖 172 积分 558 来自 江苏 | |
|
[讨论]编程中发现一个奇怪的问题 dos 提示符下键入
出现一个cmd进程 但键入下边的 却出现二个cmd进程,难道运行for语句会瞬间多个进程? 我眼睛一眨不眨地盯着任务管理器看, 也没发现任务数有什么变化。 有谁能解释一番? |
|
| 第2楼 knoppix7 | 发表于 2008-07-19 18:37 |
| 银牌会员 发帖 634 积分 1,287 来自 cmd.exe | |
|
For 需要另开一个CMD.
|
|
| 第3楼 lxmxn | 发表于 2008-07-19 18:49 |
| 版主 发帖 4,938 积分 11,386 | |
Originally posted by knoppix7 at 2008-7-19 18:37: 不是for语句要开一个CMD,是因为这里用到了for的 /F 参数,并且in后面的括号里面是单引号包围的命令,执行这个命令需要for命令另外开启一个CMD子进程来完成,完成之后子进程再把结果交给父进程,也就是执行for语句的这个CMD进程,所以这里出现了两个CMD进程。 其它的for命令是不需要另外开启子进程的。 执行下面这个命令的时候,可以在任务管理器看到两个进程 下面这个命令执行之间稍微有点长,在这段时间里,我们看任务管理器的话,里面只有一个CMD进程,可以说明FOR命令是不一定产生子CMD进程的。 |
|
| 第4楼 HAT | 发表于 2008-07-19 19:05 |
| 版主 发帖 5,017 积分 9,023 | |
|
即使没有单引号包围的命令,也可能出现两个cmd.exe进程。
|
|
| 第5楼 knoppix7 | 发表于 2008-07-19 20:31 |
| 银牌会员 发帖 634 积分 1,287 来自 cmd.exe | |
Originally posted by lxmxn at 2008-7-19 06:49 PM: 受教 |
|
| 第6楼 quya | 发表于 2008-07-19 21:09 |
| 高级用户 发帖 172 积分 558 来自 江苏 | |
|
那么如何才能用FOR 命令只产生一个CMD进程?
我本来的命令是这样写的 原意想取得当前批处理的PID, 把其他批处理杀死, 可惜人算不如天算啊。 当然如果我把当前批处理 TITEL test, 然后用判断 /fi "windowtitle eq test" 也可以达到目的,但别的批处理也可以加标题来骗过被杀啊。另外别的批处理还可以把 cmd.exe改名来躲避追杀。 我觉得这个问题很有趣,大家有啥好办法? |
|
| 第7楼 26933062 | 发表于 2008-07-19 21:50 |
| 银牌会员 发帖 879 积分 2,268 | |
|
虽然开启了两个cmd进程,但是是有先后的,可以根据这个来结束想要结束的cmd进程。
|
|
| 第8楼 quya | 发表于 2008-07-19 22:03 |
| 高级用户 发帖 172 积分 558 来自 江苏 | |
Originally posted by 26933062 at 2008-7-19 09:50 PM: 问题是如何取得当前CMD或者其他CMD的pid, 只有pid是唯一的,我写的代码用意也在此,可惜失败了。 因为我想杀死在这之前和之后的批处理,除了有意要保留的。 |
|
| 第9楼 26933062 | 发表于 2008-07-19 22:10 |
| 银牌会员 发帖 879 积分 2,268 | |
|
1
|
|
| 第10楼 quya | 发表于 2008-07-19 22:48 |
| 高级用户 发帖 172 积分 558 来自 江苏 | |
|
9楼代码不错。
不过我想到实用还有段距离,只好再请教了。 1.如我前述,批处理可以改CMD名字来防止被杀死,怎么办? 2. 假如杀已经存在的批处理,这个好办,按你的办法把自己排除掉,在开始运行就把已经存在的批处理杀了。 3. 但接着调用一个友好批处理(简称友军),假定这个过程很快,其他批处理插不进来,然后除了自己和友军(友军负责主要任务),自己负责监视如有其他批处理执行,即杀无赦。 等友军执行完任务就把自己杀了,然后友军也退出运行。 思路:自己要执行一个循环,加上一定的延时, 因为循环无法自己终止,也不知道友军何时执行完任务,所以也无法定时自杀,只能等友军执行完任务杀死自己。加上延时是为了防止自己和友军的FOR语句产生的CMD进程被误杀,可以隔一段时间判断,如果另外的CMD还存在,说明基本上不是FOR语句产生的。 另外也不能误杀不是批处理的程序。 谢谢了。 [ Last edited by quya on 2008-7-19 at 11:09 PM ] |
|
| 第11楼 HAT | 发表于 2008-07-19 23:06 |
| 版主 发帖 5,017 积分 9,023 | |
|
友军执行完任务以后杀死所有的批处理不就行了?
|
|
| 第12楼 quya | 发表于 2008-07-19 23:13 |
| 高级用户 发帖 172 积分 558 来自 江苏 | |
Originally posted by HAT at 2008-7-19 11:06 PM: 不允许在友军执行任务的时候有其他批处理中途执行, 所以等它执行完任务再杀已经迟了。友军干的事情可能被其他批处理偷窥了。 |
|
| 第13楼 26933062 | 发表于 2008-07-19 23:29 |
| 银牌会员 发帖 879 积分 2,268 | |
|
先执行友军再获得友军的pid 不就可以了?
|
|
| 第14楼 bat-zw | 发表于 2008-07-20 09:19 |
| 金牌会员 发帖 1,276 积分 3,105 | |
|
老土这是要研究杀木马吧?
|
|
| 第15楼 quya | 发表于 2008-07-20 18:52 |
| 高级用户 发帖 172 积分 558 来自 江苏 | |
Originally posted by zw19750516 at 2008-7-20 09:19 AM: 不是,其实这是加密批处理的一个思路。 批处理无论怎么转成EXE, 在临时目录总能找到 BAT文件, 我的思路是,把关键的批处理拷贝到一个特殊目录执行,比如 Internet 缓存文件夹,这种文件夹用资源管理器是看不见的, 只能用DOS看。 所以为了防止DOS下dir, copy, 就要把批处理杀死。就我经验来看,成功copy出临时释放的BAT, 手脚快点大概要2秒钟(不包括搜索的时间), 这个时间足够终止批处理了。 其他的我已经处理得差不多了,就只剩下这个不好办。 |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |