什么是使用cscript而不是wscript强制VBS运行的stackoverflow批准(因此也是正确的)方法 - 无论用户尝试了什么?
一个快速的谷歌搜索显示了很多例子,但其中一些只是不起作用,那些往往不能处理它可能已经运行参数的事实所以我很想知道什么是最好的方式是。
这是一个不处理参数的例子:
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
我很欣赏这可能很容易修改以处理参数,但意识到这可能不是解决问题的最佳方法。
背景:我正在编写一个脚本,可以通过双击或(很可能)从DOS批处理文件或作为计划任务运行。它可以包含一个或多个可选的命令行参数。
答案 0 :(得分: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
它处理参数,AND检查所述参数中的空格 - 以便在文件名传递给包含空格的原始脚本实例的情况下,它不会被标记化&#34;传递给cscript.exe。
它唯一没做的就是测试StdIn(例如,在某人通过命令行将某些内容传递给脚本,但忘记使用&#34; cscript script.vbs&#34;) - 但如果它是由WScript.exe执行的,WScript.StdIn的方法都会返回Invalid Handle错误,所以无论如何都无法测试它。
如果可以通过&#34;打破&#34;随时告诉我。这个;如有必要,我愿意改进它。
答案 1 :(得分:4)
对forceCScriptExecution的两个小补充让我在终止后看到它的Window并处理它的返回码。
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
注意:“cmd / k”让Windows在执行后停留。参数“1”激活窗口。参数“true”等待终止,因此变量“ret”可以返回错误代码。
答案 2 :(得分:3)
这里有一个类似的JScript,用于在CScript中运行.js文件:
(function(ws) {
if (ws.fullName.slice(-12).toLowerCase() !== '\\cscript.exe') {
var cmd = 'cscript.exe //nologo "' + ws.scriptFullName + '"';
var args = ws.arguments;
for (var i = 0, len = args.length; i < len; i++) {
var arg = args(i);
cmd += ' ' + (~arg.indexOf(' ') ? '"' + arg + '"' : arg);
}
new ActiveXObject('WScript.Shell').run(cmd);
ws.quit();
}
})(WScript);
WScript.echo('We are now in CScript. Press Enter to Quit...');
WScript.stdIn.readLine();
答案 3 :(得分:1)
一种方法可能是给它另一个扩展而不是.vbs。比如说.cvbs。将.cvbs与cscript.exe关联而不是wscript.exe,这样执行或双击.cvbs文件将永远不会调用wscript.exe。
答案 4 :(得分:0)
这是我用于部分脚本的代码片段。 它也处理参数。您所要做的就是将{EnterWorC}替换为&#34; w&#34;或&#34; c&#34; 带引号
Dim WorC, Command, Arguments, I
WorC={EnterWOrC} 'Make sure you replace "{EnterWOrC}" with a "w" or a "c" and BE SURE TO PUT QUOTES AROUND THE LETTER.
WorC=LCase (WorC)
If lcase (WorC)="w" Or lcase (WorC)="c" Then
If LCase (Right (WScript.FullName,11))<> WorC & "script.exe" Then
command=WScript.ScriptFullName
Arguments=""
For I=0 To UBound (WScript.Arguments)
Arguments=Arguments & Chr (34) & WScript.Arguments(I) & Chr (34) & Space (1)
Next
CreateObject("Wscript.Shell").Run WorC & "script.exe " & Chr (34) & command & Chr (34) & Space (1) & Arguments, 1
WScript.Quit
End If
WorC=Empty
Command=Empty
I=Empty
Arguments=Empty
End If
在这里你必须更换第二行(第二条非空行)
WorC={EnterWOrC} 'Make sure you replace "{EnterWOrC}" with a "w" or a "c" and BE SURE TO PUT QUOTES AROUND THE LETTER.
对于Wscript:WorC="W"
对于CScript:WorC="C"
这不是敏感的。