Vbscript 使用Exec()时隐藏命令提示窗口

Vbscript 使用Exec()时隐藏命令提示窗口,vbscript,Vbscript,我正在尝试执行这个简单的测试脚本,但在执行脚本后会出现一个命令shell窗口: Set objShell = WScript.CreateObject("WScript.Shell") strCommand = "cmd /C tasklist" Set objExecObject = objShell.Exec(strCommand) wscript.echo "Test" 我怎样才能防止它出现 更新 我能够通过以下代码更改对其进行改进: strCommand = "cmd /C /Q

我正在尝试执行这个简单的测试脚本,但在执行脚本后会出现一个命令shell窗口:

Set objShell = WScript.CreateObject("WScript.Shell")

strCommand = "cmd /C tasklist"

Set objExecObject = objShell.Exec(strCommand)

wscript.echo "Test"
我怎样才能防止它出现

更新

我能够通过以下代码更改对其进行改进:

strCommand = "cmd /C /Q tasklist"

现在窗口只显示一秒钟。但是我根本不想让它出现。

你总是会得到一个带有
Exec()
的窗口闪光灯。您可以使用
Run()
在隐藏窗口中执行命令。但是不能使用
Run()
直接捕获命令的输出。您必须将输出重定向到一个临时文件,然后VBScript可以打开、读取和删除该文件

例如:

使用CreateObject(“WScript.Shell”)的

'将0作为第二个参数传递以隐藏窗口。。。
.运行“cmd/c tasklist.exe>c:\out.txt”,0,True
以
'读取输出并在完成后删除文件。。。
暗输出
使用CreateObject(“Scripting.FileSystemObject”)
strOutput=.OpenTextFile(“c:\out.txt”).ReadAll()
.delete文件“c:\out.txt”
以
FileSystemObject
类具有检索Windows temp文件夹路径和生成临时文件名等方法,您可以使用这些方法来代替我上面所做的硬编码输出文件名

还请注意,您可以将
/FO CSV
参数与
tasklist.exe
一起使用,以创建一个CSV文件,这将使解析更加容易

最后,有一些VBScript“本机”方法可以检索正在运行的进程列表。例如,WMI类可以在不需要
Run/Exec
的情况下执行此操作


编辑

为了完整起见,我应该提到,您的脚本可以在一个隐藏的控制台窗口中重新启动,您可以在该窗口中以静默方式运行
Exec()
。不幸的是,这个隐藏的控制台窗口还将隐藏您对诸如
WScript.Echo()
之类的函数的输出。但是,除此之外,您可能不会注意到在
cscript
下运行脚本与
wscript
下运行脚本有任何区别。以下是此方法的一个示例:

'如果在wscript.exe下运行,请在隐藏窗口中的cscript.exe下重新启动。。。
如果InStr(1,WScript.FullName,“WScript.exe”,vbTextCompare)>0,则
使用CreateObject(“WScript.Shell”)
WScript.Quit.Run(“cscript.exe”“&WScript.ScriptFullName&”“,0,True)
以
如果结束
“真实”是脚本的开始。我们现在可以运行Exec()隐藏。。。
暗输出
strOutput=CreateObject(“WScript.Shell”).Exec(“tasklist.exe”).StdOut.ReadAll()
'需要使用MsgBox(),因为WScript.Echo()被发送到隐藏的控制台窗口。。。
MsgBox输出
当然,如果脚本需要命令行参数,那么在重新启动脚本时也需要转发这些参数


编辑2

另一种可能是使用Windows剪贴板。您可以通过管道将命令的输出传输到
clip.exe
实用程序。然后,通过可访问剪贴板内容的任意数量的可用COM对象检索文本。例如:

”使用隐藏窗口,通过管道将命令的输出传输到CLIP.EXE实用程序。。。
CreateObject(“WScript.Shell”)。运行“cmd/c tasklist.exe | clip”,0,True
'现在读取剪贴板文本。。。
暗输出
strOutput=CreateObject(“htmlfile”).ParentWindow.ClipboardData.GetData(“文本”)
您可以使用
.Exec()
方法,而无需控制台窗口闪烁、临时文件和意外的
WScript.Echo
输出静音。该方法有点棘手,需要启动二级链接脚本,因此我添加了注释:

选项显式
Dim objDummy、strSignature、objPrimary、objSecondary、objContainer、objWshShell、objWshShellExec、strResult
'此块仅在主脚本运行cscript后在辅助脚本流中执行
如果WScript.Arguments.Named.Exists(“签名”),则
'从参数中检索签名字符串
strSignature=WScript.Arguments.Named(“签名”)
做
'在所有资源管理器窗口中循环
对于CreateObject(“Shell.Application”).Windows中的每个objContainer
'检查具有签名名称的资源管理器属性是否包含对live脚本的引用
如果ChkVBScriptTypeInfo(objContainer.getProperty(strSignature))那么
退出Do
如果结束
下一个
WScript.Sleep 10
环
'在辅助脚本中创建shell对象
设置objWshShell=CreateObject(“WScript.Shell”)
'从具有签名名的资源管理器属性检索主脚本me对象引用
Set objPrimary=objContainer.getProperty(strSignature)
'退出资源管理器窗口以释放不再需要的内存
对象容器。退出
'将辅助脚本me对象分配给主脚本的变量
设置objPrimary.objSecondary=Me
'主脚本工作时emtpy循环
Do While ChkVBScriptTypeInfo(objPrimary)
WScript.Sleep 10
环
'终止二级
WScript.Quit
如果结束
'以下代码首先在主脚本流中执行
'创建签名字符串
strSignature=Left(CreateObject(“Scriptlet.TypeLib”).Guid,38)
'创建新的隐藏资源管理器窗口作为容器,以便在脚本进程之间传输引用
设置objContainer=GetObject(“新:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}”)
'将此脚本的me对象引用放入资源管理器的属性中
objContainer.putProperty结构签名,Me
'通过带有隐藏控制台窗口的cscript.exe启动同一脚本文件的新辅助进程,在命名参数中提供签名字符串以标识主机脚本
CreateObject(“WScript.Shell”)。运行(“”&Replace(LCase(WScript.FullName)、“WScript”、“cscript”)和“//nologo”&WScript.ScriptFullName&“/signature:”&strSignature&“),0
'等待辅助脚本已初始化,然后重试
Set Sh = CreateObject("WScript.Shell")
tFile=Sh.ExpandEnvironmentStrings("%Temp%")&"\t.txt"
Sh.Run "cmd.exe /C tasklist > """&tFile&""" ",0,False
Wscript.echo CreateObject("Scripting.FileSystemObject").openTextFile(tFile).readAll() 
If StrComp(right(WScript.FullName,11),"wscript.exe",1) = 0 Then     '' get only wscript.exe from "c:\windows\system32\wscript.exe" to compere with wscript.exe
  WScript.Quit CreateObject("WScript.Shell").Run("cscript.exe """ & WScript.ScriptFullName & """", 0, False)
End If
MsgBox CreateObject("WScript.Shell").Exec("cmd.exe /c tasklist /v /fi ""imagename EQ explorer*"" /FO LIST | FIND ""PID:""").StdOut.ReadAll()
With CreateObject("WScript.Shell")

    .Run "cmd /c start /b tasklist.exe > c:\out.txt", 0, True

End With
START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
      [command/program] [parameters]

    "title"     Title to display in window title bar.
    path        Starting directory.
    B           Start application without creating a new window. The
                application has ^C handling ignored. Unless the application
                enables ^C processing, ^Break is the only way to interrupt
                the application.