无忧启动论坛

标题: vbs 隐藏运行,支持附带 带空格的参数,可以在带空格的目录运行。 [打印本页]

作者: dos时代菜鸟    时间: 2018-4-20 09:23
标题: vbs 隐藏运行,支持附带 带空格的参数,可以在带空格的目录运行。
本帖最后由 dos时代菜鸟 于 2018-4-20 10:24 编辑

不多说,直接上代码,把代码放到 vbs 脚本 前端,可实现 隐藏运行,并且 支持在 带空格的文件夹 中运行,支持带 空格 的参数。参数要用 引号包裹。

  1. '---------------------------------------------------
  2. set ws=createObject("wscript.shell")
  3. Set fs=CreateObject("scripting.filesystemobject")
  4. pathx=fs.GetFile(WScript.scriptFullName).ParentFolder.Path
  5. hide=pathx&""&mid(wScript.ScriptName,1,Len(wScript.ScriptName)-4)&"_hide.vbs"
  6. '------------二次调用以隐藏运行,支持在带空格的目录执行,切参数可带空格----------------------------
  7. if fs.FileExists(hide)=false then
  8.         Set file1=fs.OpenTextFile(hide,2,True)
  9.         file1.WriteLine "set ws=createObject("&chr(34)&"wscript.shell"&chr(34)&") "
  10.         file1.WriteLine "pathx="&chr(34)&WScript.scriptFullName&chr(34)
  11.         file1.WriteLine "cmd0=chr(34)&pathx&chr(34)"
  12.   file1.WriteLine "args="&chr(34)&"  "&chr(34)
  13.   for each arg in WScript.Arguments
  14.     file1.WriteLine "argx="&chr(34)&arg&chr(34)
  15.     file1.WriteLine "args=args&"&chr(34)&"  "&chr(34)&"&chr(34)&argx&chr(34)"
  16.   next
  17.         file1.WriteLine "ws.run "&chr(34)&"cscript.exe "&chr(34)&"&cmd0&args,0,false"
  18.         file1.close
  19.         cmd1=chr(34)&hide&chr(34)
  20.         ws.Run "cscript.exe "&cmd1,0,true
  21.         WScript.quit
  22. else
  23.         fs.DeleteFile(hide)
  24. End if        

复制代码


hide1.zip

770 Bytes, 下载次数: 27, 下载积分: 无忧币 -2


作者: 窄口牛    时间: 2018-4-20 09:27
不明白,vbs隐藏是没有script进程?
作者: dos时代菜鸟    时间: 2018-4-20 09:45
本帖最后由 dos时代菜鸟 于 2018-4-20 10:45 编辑
窄口牛 发表于 2018-4-20 09:27
不明白,vbs隐藏是没有script进程?

不,只是 没有了 窗口而已。

有的时候 不能用 run 方式 隐藏运行 vbs 调用的程序,比如 ftp.exe,因为需要 给 ftp.exe 输入命令,就需要用到 exec 方式 运行 ftp.exe ,而 exec 有不想 Run 那样有隐藏窗口的功能,结果,就会有一个 ftp.exe 的黑窗口。

所以,用 run 通过 cscript.exe 二次调用 脚本自身,但是 如果脚本存放在 有空格的目录里面 或者 脚本 附带的参数 有空格,就需要 考虑。

  1. '---------------------------------------------------
  2. set ws=createObject("wscript.shell")
  3. Set fs=CreateObject("scripting.filesystemobject")

  4. pathx=fs.GetFile(WScript.scriptFullName).ParentFolder.Path
  5. hide=pathx&""&mid(wScript.ScriptName,1,Len(wScript.ScriptName)-4)&"_hide.vbs"
  6. '------------二次调用以隐藏运行,支持在带空格的目录执行,切参数可带空格----------------------------
  7. if fs.FileExists(hide)=false then
  8.         Set file1=fs.OpenTextFile(hide,2,True)
  9.         file1.WriteLine "set ws=createObject("&chr(34)&"wscript.shell"&chr(34)&") "
  10.         file1.WriteLine "pathx="&chr(34)&WScript.scriptFullName&chr(34)
  11.         file1.WriteLine "cmd0=chr(34)&pathx&chr(34)"
  12.   file1.WriteLine "args="&chr(34)&"  "&chr(34)
  13.   for each arg in WScript.Arguments
  14.     file1.WriteLine "argx="&chr(34)&arg&chr(34)
  15.     file1.WriteLine "args=args&"&chr(34)&"  "&chr(34)&"&chr(34)&argx&chr(34)"
  16.   next
  17.         file1.WriteLine "ws.run "&chr(34)&"cscript.exe "&chr(34)&"&cmd0&args,0,false"
  18.         file1.close
  19.         cmd1=chr(34)&hide&chr(34)
  20.         ws.Run "cscript.exe "&cmd1,0,true
  21.         WScript.quit
  22. else
  23.         fs.DeleteFile(hide)
  24. End if        

  25. set cmd=ws.exec("cmd.exe")
  26. cmd.stdin.WriteLine "dir c:\ /b /s /a-d > "&chr(34)&pathx&chr(34)&"\c.txt"
  27. cmd.stdin.WriteLine "dir c:\*.dll /b /s /a-d > "&chr(34)&pathx&chr(34)&"\dll.txt"
  28. cmd.stdin.WriteLine "exit"
  29. Do Until cmd.Status=1
  30.   wscript.sleep 100
  31. Loop
  32. msgbox "脚本运行完毕"
复制代码
比如 ,上面代码,就是 隐藏调用 cmd.exe 并向 cmd 窗口传递指令 分别获取 c:盘 文件列表 和 dll 文件列表,分别存如 当前文件夹 的 c.txt 和 dll.txt
如果 是以前 用 run 方式隐藏运行 cmd ,最安全稳妥的办法 是 生成一个 cmd 脚本,在有 vbs 隐藏调用。而上面这个 办法就不用了,把 cmd 指令 可以写入 vbs 中,而不用生成 cmd 脚本。
虽然也要临时生成一个 二次调用 自身vbs 的脚本,但脚本 内容基本一样,临时脚本代码量固定。没啥需要隐蔽的代码,这个 对于 不想把代码 公布 的vbs 来说,还是有用的。

作者: eastmz    时间: 2018-4-20 09:45
厉害了我的哥
作者: q8155128    时间: 2018-4-20 09:49
eastmz 发表于 2018-4-20 09:45
厉害了我的哥

发现大师你水贴水平不错的嘛.......
作者: eastmz    时间: 2018-4-20 09:56
q8155128 发表于 2018-4-20 09:49
发现大师你水贴水平不错的嘛.......

哇!谢谢夸宝宝,宝宝受益良多…
作者: nttwqz    时间: 2018-4-20 11:03
最近活跃的很那

不懂vbs
作者: dos时代菜鸟    时间: 2018-4-20 11:47
有了 这个 可以考虑 把 cmd 转化成 vbs ,切隐藏运行。
作者: slore    时间: 2018-4-21 11:40
本帖最后由 slore 于 2018-4-21 11:55 编辑

'---------------------------------------------------
Set objShell = CreateObject("WSCript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments

pathx = objFSO.GetFile(WScript.scriptFullName).ParentFolder.Path

Sub RunHide()
   
Dim self, args, i
    self = """" & WScript.scriptFullName  & """"
    args = " "
    For i = 1 To objArgs.Count
        args = args & """" & objArgs(i) & """ "
    Next
    If
args = " " Then args = " -dummy"
    objShell.Run "cscript.exe " & self & args, 0, False
   
WSCript.Quit(0)
End Sub

If
objArgs.Count = 0 Then
   
RunHide
ElseIf objArgs(0) = "-hide" Then
   
RunHide
End If

Set
cmd = objShell.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
"脚本运行完毕"


用第一个参数区分,不需要临时文件。
作者: dos时代菜鸟    时间: 2018-4-21 11:44
本帖最后由 dos时代菜鸟 于 2018-4-21 13:06 编辑
slore 发表于 2018-4-21 11:40
'---------------------------------------------------
Set objShell = CreateObject("WSCript.Shell")
...


研究下,有道理

如果 原有程序 需要 读取 第一个参数 参与程序计算呢?
作者: dos时代菜鸟    时间: 2018-4-21 16:39
slore 发表于 2018-4-21 11:40
'---------------------------------------------------
Set objShell = CreateObject("WSCript.Shell")
...

按照 你的方法  修改如下,把 -hide 放到最后一个参数,唯一需要注意的就是 主代码中涉及引用 参数个数的时候,需要 -1

  1. On error resume next

  2. '----------------隐藏运行代码-----------------------
  3. set ws=createObject("wscript.shell")
  4. hide= """" & WScript.scriptFullName  & """"
  5. if WScript.Arguments.count=0  then
  6.         ws.run "cscript.exe " & hide &"  -hide " ,0,false
  7.         WScript.quit
  8. elseif WScript.Arguments(WScript.Arguments.count-1)<>"-hide" then
  9.   args=" "
  10.   for each arg in WScript.Arguments
  11.     args=args&"  "& """" & arg & """"
  12.   next
  13.         ws.run "cscript.exe " & hide &args &"  -hide " ,0,false
  14.         WScript.quit
  15. end if
  16. '-----------------隐藏代码结束----------------------

  17. '-------功能代码-----------------------
  18. Set fs=CreateObject("scripting.filesystemobject")
  19. pathx = fs.GetFile(WScript.scriptFullName).ParentFolder.Path

  20. Set cmd = ws.exec("cmd.exe")
  21. cmd.stdin.WriteLine "dir c:\ /b /s /a-d > " & Chr(34) & pathx & Chr(34) & "\c.txt"
  22. cmd.stdin.WriteLine "dir c:\*.dll /b /s /a-d > " & Chr(34) & pathx & Chr(34) & "\dll.txt"
  23. cmd.stdin.WriteLine "exit"
  24. Do Until cmd.Status = 1
  25.     WScript.sleep 100
  26. Loop
  27. MsgBox "脚本运行完毕"
复制代码


作者: stlcours    时间: 2018-5-7 01:55
是双击就可以执行吗??还是可以在程序里调用这个vbs脚本
作者: dos时代菜鸟    时间: 2018-5-7 08:33
stlcours 发表于 2018-5-7 01:55
是双击就可以执行吗??还是可以在程序里调用这个vbs脚本

要想使用 还是需要 动脑筋滴,不是 伸手就能用滴。
作者: Anson4    时间: 2018-5-7 08:49
看代码感觉有压力
作者: freefree    时间: 2018-6-12 12:22
vbs脚本不懂,能否加上以管理员方式运行代码?谢谢




欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3