您好,TO。我们并不想在脚本编写界制造丑闻,好吧,我们不想在脚本编写界制造“更多”丑闻。不过,屏住气,我们要在此耍个小花招。这是第一次有人问这个问题,要回答此问题,我们先回顾一下几个月前曾有人提过的另一个问题的答案。
即:只要您运行 Windows XP 或 Windows Server 2003,那么,是的,很容易就能说出启动可执行文件时使用了哪些命令行参数(如果有)。那是因为在这两个版本的 Windows(非先前的版本)中,WMI 类 Win32_Process 包含一个名为“CommandLinethat”的属性,该属性提供用于启动可执行文件的完整命令行(包括开关)。
例如,假设 Netstat.exe 正运行于计算机上,您想了解哪些命令行开关用于启动该程序。使用这个脚本可获得该信息:
strComputer = "."
Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2") Set colItems = objWMIService.ExecQuery _ ("Select * From Win32_Process Where Name = 'netstat.exe'")
For Each objItem in colItems Wscript.Echo objItem.CommandLine Next
如您所见,这是一个很简单的小脚本:我们返回一个包含所有名为 Netstat.exe 的进程的集合,然后,我们回显其中每个进程的 CommandLine 属性。假定我们使用如下命令启动 Netstat:netstat.exe –a 30。在此情况下,如下所示是我们的脚本报告的 CommandLine 属性:
netstat.exe –a 30
关于 CommandLine 属性的有趣之处在于即使您并没有使用命令行,它也经常会提供有用的信息。例如,假设您有一个名为 C:/Scripts/Inventory.vbs 的脚本,并且您右键单击“我的电脑”中的文件,然后选择“编辑”。这样将在记事本(假设记事本是默认的脚本编辑器)中打开该脚本。以下是该记事本实例的 CommandLine 属性:
C:/WINDOWS/System32/Notepad.exe C:/scripts/inventory.vbs
换言之,我们不但知道记事本打开了,还知道哪个“文件”(inventory.vbs) 打开了。尽管许多不同的应用程序都会以这种相同的方式运行,出于某种原因,Microsoft Word 或 Excel“不会”如此运行。(但很有趣的是 PowerPoint 会如此运行。)使用 Word 和 Excel 应用程序,可以获得启动程序的 CommandLine,但不能指示打开了哪个文档。而是得到一个如下的普通命令行字符串:
"C:/Program Files/Microsoft Office/OFFICE11/EXCEL.EXE" /e
顺便说一下,如果机器长时间挂起,我们对该问题的回答是相同的(Win32_Process 类的 CommandLine 属性):如何了解计算机上正在运行哪些脚本?为此,查看任意 Wscript.exe 和 CScript.exe 进程的 CommandLine 属性,CommandLine 将包含在某个脚本宿主之下正运行的脚本的名称。或者,以编程方式实现:
strComputer = "."
Set objWMIService = GetObject("winmgmts://" & strComputer & "/root/cimv2") Set colItems = objWMIService.ExecQuery _ ("Select * From Win32_Process Where Name = 'wscript.exe' OR Name = ‘cscript.exe’")
For Each objItem in colItems Wscript.Echo objItem.CommandLine Next