Ric*_*ard 17 vbscript arguments wsh
什么是stackoverflow批准(因此正确)方法强制VBS使用cscript而不是wscript运行 - 无论用户尝试什么?
一个快速的谷歌搜索显示了大量的例子,但其中一些只是不起作用,而那些通常不能处理它可能已经参数运行的事实,所以我很想知道最好的方法是什么.
这是一个不处理参数的例子:
sExecutable = LCase(Mid(Wscript.FullName, InstrRev(Wscript.FullName,"\")+1))
If sExecutable <> "cscript.exe" Then
Set oShell = CreateObject("wscript.shell")
oShell.Run "cscript.exe """ & Wscript.ScriptFullName & """"
Wscript.Quit
End If
Run Code Online (Sandbox Code Playgroud)
我很欣赏这可能很容易修改以处理参数,但意识到这可能不是解决问题的最佳方法.
背景:我正在编写一个脚本,可以通过双击或(很可能)从DOS批处理文件或作为计划任务运行.它可以包含一个或多个可选的命令行参数.
小智 22
我的主,什么是纯粹的垃圾.看到这样肮脏的编码让我哭泣(对任何人都没有冒犯,哈哈).但说真的,这是我的2便士:
Sub forceCScriptExecution
Dim Arg, Str
If Not LCase( Right( WScript.FullName, 12 ) ) = "\cscript.exe" Then
For Each Arg In WScript.Arguments
If InStr( Arg, " " ) Then Arg = """" & Arg & """"
Str = Str & " " & Arg
Next
CreateObject( "WScript.Shell" ).Run _
"cscript //nologo """ & _
WScript.ScriptFullName & _
""" " & Str
WScript.Quit
End If
End Sub
forceCScriptExecution
Run Code Online (Sandbox Code Playgroud)
它处理参数,AND检查所述参数中的空格 - 因此,如果文件名传递给包含空格的原始脚本实例,则传递给cscript.exe时不会"标记化".
它唯一不做的是测试StdIn(例如,在某人通过命令行将某些内容传递给脚本,但忘记使用"cscript script.vbs") - 但是如果它是由WScript执行的话. exe,WScript.StdIn的方法都返回Invalid Handle错误,所以无论如何都无法测试.
如果有办法"打破"这个,请随时告诉我.如果有必要,我愿意改进它.
小智 5
对forceCScriptExecution 的两个小补充让我可以在终止后看到它的窗口并处理它的返回代码。
Sub forceCScriptExecution
Dim Arg, Str
If Not LCase( Right( WScript.FullName, 12 ) ) = "\cscript.exe" Then
For Each Arg In WScript.Arguments
If InStr( Arg, " " ) Then Arg = """" & Arg & """"
Str = Str & " " & Arg
Next
**ret =** CreateObject( "WScript.Shell" ).Run **("cmd /k** cscript //nologo """ & WScript.ScriptFullName & """ " & Str**,1,true)**
WScript.Quit **ret**
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
注意:“cmd /k”让窗口在执行后保持不变。参数“1”激活窗口。参数“true”等待终止,因此变量“ret”可以返回错误代码。