[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
异同之处在于cmd的启动参数
双击时是/c参数启动的,而手动输入时是默认工作状态,也就是没参数或参数为/k

TOP

  1. @ECHO OFF
  2. title 标题
  3. For /f "tokens=2" %%i in ('tasklist /fi "windowtitle eq 标题" /nh') Do set handle=%%i
  4. wmic process where handle='%handle%' get commandline|findstr /i /c:"cmd \/c"&&set HH=PAUSE
  5. %HH%
复制代码
1

评分人数

TOP

原帖由 qingfengzhixia 于 2008-11-14 20:52 发表




有没有人能解释一下。
两处不懂
1。“'tasklist /fi "windowtitle eq 标题" /nh'
2。wmic


tasklist中的/fi参数是一个筛选器,随后的 "windowtitle eq 标题"是这个筛选器的条件,指窗口标题为‘标题’的即符合要求,/nh参数去掉了表头,方便在for中提取数据

wmic 是windows wmi标准的一个简化工具,在这里使用wmic查询了当前PID为%handle%的进程的启动命令行

TOP

原帖由 slore 于 2008-11-14 12:01 发表
不管是路径,标题的都是有空钻的……多开的话,检测就有问题。

如何能得到当前cmd的pid是关键。

Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Setting ...


根据你要求改了下
  1. @ECHO OFF&Set /A _wt=%random%/2
  2. title 标题%_wt%
  3. For /f "tokens=2" %%i in ('tasklist /fi "windowtitle eq 标题%_wt%" /nh') Do set handle=%%i
  4. wmic process where handle='%handle%' get commandline|findstr /i /c:"cmd \/c"&&set HH=PAUSE
  5. %HH%
复制代码

TOP

原帖由 shqf 于 2008-11-14 22:39 发表
各位试试行吗?我在本机上试符合要求了
@echo off
if "%0"=="%~0" (echo CMD中手动输入运行) else (echo 双击运行)
pause
exit


"%0"有一半的可能会出现两重引号,这在IF里会被识别为非法并且中断命令行

例如你的批处理文件名为:bath title.cmd
那么你的判断就不能成立

TOP

要得到切实可靠的PID理论上是可行的,但为了让批处理执行是更人性化一点添加过多代码有顾此失彼的歉疑

以cscript.exe执行这个脚本即可得到cmd的PID
  1. Dim Wsh,Wmi
  2. Set Wsh=CreateObject("WScript.Shell")
  3. Set Wmi=GetObject("winmgmts:\\.\root\cimv2")
  4. Set Hta=Wsh.Exec("mshta 1")
  5. For Each i In Wmq(Hta.ProcessID)
  6.     WScript.Echo "脚本PID       :" & i.ParentProcessID
  7.     For Each j In Wmq(i.ParentProcessID)
  8.         WScript.Echo "脚本命令行    :" & j.CommandLine & vbCrLf &_
  9.                      "脚本父进程PID :" & j.ParentProcessID
  10.         For Each k In Wmq(j.ParentProcessID)
  11.             WScript.Echo "脚本父进程名称:" & k.Name & vbCrLf &_
  12.                          "脚本父进程命令:" & k.CommandLine
  13.         Next
  14.     Next
  15. Next
  16. Hta.Terminate
  17. Function Wmq(Pid)
  18. Set Wmq=Wmi.ExecQuery("Select * From Win32_Process Where ProcessID='" & Pid & "'")
  19. End Function
复制代码
1

评分人数

TOP

勉为其难调用下吧,嘿嘿

TOP

返回列表