|
本帖最后由 dos时代菜鸟 于 2018-4-20 10:45 编辑
不,只是 没有了 窗口而已。
有的时候 不能用 run 方式 隐藏运行 vbs 调用的程序,比如 ftp.exe,因为需要 给 ftp.exe 输入命令,就需要用到 exec 方式 运行 ftp.exe ,而 exec 有不想 Run 那样有隐藏窗口的功能,结果,就会有一个 ftp.exe 的黑窗口。
所以,用 run 通过 cscript.exe 二次调用 脚本自身,但是 如果脚本存放在 有空格的目录里面 或者 脚本 附带的参数 有空格,就需要 考虑。
- '---------------------------------------------------
- set ws=createObject("wscript.shell")
- Set fs=CreateObject("scripting.filesystemobject")
- pathx=fs.GetFile(WScript.scriptFullName).ParentFolder.Path
- hide=pathx&""&mid(wScript.ScriptName,1,Len(wScript.ScriptName)-4)&"_hide.vbs"
- '------------二次调用以隐藏运行,支持在带空格的目录执行,切参数可带空格----------------------------
- if fs.FileExists(hide)=false then
- Set file1=fs.OpenTextFile(hide,2,True)
- file1.WriteLine "set ws=createObject("&chr(34)&"wscript.shell"&chr(34)&") "
- file1.WriteLine "pathx="&chr(34)&WScript.scriptFullName&chr(34)
- file1.WriteLine "cmd0=chr(34)&pathx&chr(34)"
- file1.WriteLine "args="&chr(34)&" "&chr(34)
- for each arg in WScript.Arguments
- file1.WriteLine "argx="&chr(34)&arg&chr(34)
- file1.WriteLine "args=args&"&chr(34)&" "&chr(34)&"&chr(34)&argx&chr(34)"
- next
- file1.WriteLine "ws.run "&chr(34)&"cscript.exe "&chr(34)&"&cmd0&args,0,false"
- file1.close
- cmd1=chr(34)&hide&chr(34)
- ws.Run "cscript.exe "&cmd1,0,true
- WScript.quit
- else
- fs.DeleteFile(hide)
- End if
- set cmd=ws.exec("cmd.exe")
- cmd.stdin.WriteLine "dir c:\ /b /s /a-d > "&chr(34)&pathx&chr(34)&"\c.txt"
- cmd.stdin.WriteLine "dir c:\*.dll /b /s /a-d > "&chr(34)&pathx&chr(34)&"\dll.txt"
- cmd.stdin.WriteLine "exit"
- Do Until cmd.Status=1
- wscript.sleep 100
- Loop
- msgbox "脚本运行完毕"
复制代码 比如 ,上面代码,就是 隐藏调用 cmd.exe 并向 cmd 窗口传递指令 分别获取 c:盘 文件列表 和 dll 文件列表,分别存如 当前文件夹 的 c.txt 和 dll.txt
如果 是以前 用 run 方式隐藏运行 cmd ,最安全稳妥的办法 是 生成一个 cmd 脚本,在有 vbs 隐藏调用。而上面这个 办法就不用了,把 cmd 指令 可以写入 vbs 中,而不用生成 cmd 脚本。
虽然也要临时生成一个 二次调用 自身vbs 的脚本,但脚本 内容基本一样,临时脚本代码量固定。没啥需要隐蔽的代码,这个 对于 不想把代码 公布 的vbs 来说,还是有用的。
|
|