中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [讨论]编程中发现一个奇怪的问题
« [1] [2] »
作者:
标题: [讨论]编程中发现一个奇怪的问题 上一主题 | 下一主题
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『楼 主』:  [讨论]编程中发现一个奇怪的问题

dos 提示符下键入
tasklist /nh /fi "imagename eq cmd.exe“
出现一个cmd进程

但键入下边的
for /f "tokens=*" %i in ('tasklist /nh /fi "imagename eq cmd.exe"') do echo %i
却出现二个cmd进程,难道运行for语句会瞬间多个进程? 我眼睛一眨不眨地盯着任务管理器看, 也没发现任务数有什么变化。

有谁能解释一番?



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-19 18:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 2 楼』:  

For 需要另开一个CMD.

2008-7-19 18:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by knoppix7 at 2008-7-19 18:37:
For 需要另开一个CMD.

不是for语句要开一个CMD,是因为这里用到了for的 /F 参数,并且in后面的括号里面是单引号包围的命令,执行这个命令需要for命令另外开启一个CMD子进程来完成,完成之后子进程再把结果交给父进程,也就是执行for语句的这个CMD进程,所以这里出现了两个CMD进程。

其它的for命令是不需要另外开启子进程的。

执行下面这个命令的时候,可以在任务管理器看到两个进程
for /F %a in ('pause') do @echo.%a
下面这个命令执行之间稍微有点长,在这段时间里,我们看任务管理器的话,里面只有一个CMD进程,可以说明FOR命令是不一定产生子CMD进程的。
for /r C:\ %a in (*.exe) do @echo %a


   此帖被 +7 点积分      点击查看详情   
评分人:【 knoppix7 分数: +5  时间:2008-7-19 20:32
评分人:【 WANKOILZ 分数: +2  时间:2008-7-20 10:24


2008-7-19 18:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 4 楼』:  

即使没有单引号包围的命令,也可能出现两个cmd.exe进程。
@echo off
for /f "usebackq" %%a in ("C:\test\a.txt") do echo %%a
pause




2008-7-19 19:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by lxmxn at 2008-7-19 06:49 PM:

不是for语句要开一个CMD,是因为这里用到了for的 /F 参数,并且in后面的括号里面是单引号包围的命令,执行这个命令需要for命令另外开启一个CM ...

受教

2008-7-19 20:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 6 楼』:  

那么如何才能用FOR 命令只产生一个CMD进程?

我本来的命令是这样写的 
for /f "tokens=2" %%i in ('tasklist /nh /fi "imagename eq cmd.exe"') do set pid=%%i
taskkill /f /fi "pid ne %pid%" /im cmd.exe
原意想取得当前批处理的PID, 把其他批处理杀死, 可惜人算不如天算啊。

当然如果我把当前批处理 TITEL test, 然后用判断 /fi "windowtitle eq test" 也可以达到目的,但别的批处理也可以加标题来骗过被杀啊。另外别的批处理还可以把 cmd.exe改名来躲避追杀。

我觉得这个问题很有趣,大家有啥好办法?



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-19 21:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 7 楼』:  

虽然开启了两个cmd进程,但是是有先后的,可以根据这个来结束想要结束的cmd进程。



致精致简!
2008-7-19 21:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by 26933062 at 2008-7-19 09:50 PM:
虽然开启了两个cmd进程,但是是有先后的,可以根据这个来结束想要结束的cmd进程。

问题是如何取得当前CMD或者其他CMD的pid, 只有pid是唯一的,我写的代码用意也在此,可惜失败了。

因为我想杀死在这之前和之后的批处理,除了有意要保留的。



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-19 22:03
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 9 楼』:  

1

  Quote:

  1. @echo off
  2. for /f "tokens=2" %%i in ('tasklist /nh /fi "imagename eq cmd.exe"') do (
  3.    call set pid=%%i %%pid%%
  4. )
  5. for /f "tokens=2" %%a in ("%pid%") do (
  6.    echo 当前批处理 cmd 进程的 pid 是 %%a
  7. )
  8. pause
                小楼一夜听春雨  2008-07-19  22:00



   此帖被 +5 点积分       点击查看详情   
评分人:【 quya 分数: +5  时间:2008-7-19 22:48




致精致简!
2008-7-19 22:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 10 楼』:  

9楼代码不错。

不过我想到实用还有段距离,只好再请教了。

1.如我前述,批处理可以改CMD名字来防止被杀死,怎么办?
2. 假如杀已经存在的批处理,这个好办,按你的办法把自己排除掉,在开始运行就把已经存在的批处理杀了。
3. 但接着调用一个友好批处理(简称友军),假定这个过程很快,其他批处理插不进来,然后除了自己和友军(友军负责主要任务),自己负责监视如有其他批处理执行,即杀无赦。 等友军执行完任务就把自己杀了,然后友军也退出运行。

思路:自己要执行一个循环,加上一定的延时, 因为循环无法自己终止,也不知道友军何时执行完任务,所以也无法定时自杀,只能等友军执行完任务杀死自己。加上延时是为了防止自己和友军的FOR语句产生的CMD进程被误杀,可以隔一段时间判断,如果另外的CMD还存在,说明基本上不是FOR语句产生的。 另外也不能误杀不是批处理的程序。

谢谢了。

[ Last edited by quya on 2008-7-19 at 11:09 PM ]



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-19 22:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 11 楼』:  

友军执行完任务以后杀死所有的批处理不就行了?



2008-7-19 23:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 12 楼』:  



  Quote:
Originally posted by HAT at 2008-7-19 11:06 PM:
友军执行完任务以后杀死所有的批处理不就行了?

不允许在友军执行任务的时候有其他批处理中途执行, 所以等它执行完任务再杀已经迟了。友军干的事情可能被其他批处理偷窥了。



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-19 23:13
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 13 楼』:  

先执行友军再获得友军的pid 不就可以了?



致精致简!
2008-7-19 23:29
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 14 楼』:  

老土这是要研究杀木马吧?



批处理之家新域名:www.bathome.net
2008-7-20 09:19
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
quya
高级用户

五星老土


积分 558
发帖 172
注册 2003-2-9
来自 江苏
状态 离线
『第 15 楼』:  



  Quote:
Originally posted by zw19750516 at 2008-7-20 09:19 AM:
老土这是要研究杀木马吧?

不是,其实这是加密批处理的一个思路。

批处理无论怎么转成EXE, 在临时目录总能找到 BAT文件, 我的思路是,把关键的批处理拷贝到一个特殊目录执行,比如 Internet 缓存文件夹,这种文件夹用资源管理器是看不见的, 只能用DOS看。

所以为了防止DOS下dir, copy, 就要把批处理杀死。就我经验来看,成功copy出临时释放的BAT, 手脚快点大概要2秒钟(不包括搜索的时间), 这个时间足够终止批处理了。

其他的我已经处理得差不多了,就只剩下这个不好办。



我怎么找不到一个比我注册日期早的人? 难道我是传说中的超级管理员? 其实我只是个潜水冠军而已.
2008-7-20 18:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: