我想使用Windows脚本宿主(wscript.exe或cscript.exe)执行我的应用程序生成的简单VBScript / JScript,而不生成临时脚本文件。
我没有找到命令行选项来从标准输入流中读取脚本,但我确实在WWW中找到了几个记录WScript错误消息“无法从stdin读取脚本”的地方。
MSDN Windows Script Host Reference - Error Messages
是否有一个隐藏的命令行选项来从标准中读取脚本?
目前我的程序生成一个小脚本并将其写入临时文件。然后它创建一个运行cscript.exe
的子进程,等待它完成,然后再次删除临时文件。我想摆脱临时文件并将脚本直接传递给脚本主机,如果可能的话。 (例如,将其传递给cscript.exe
或将其作为命令行参数的一部分传递,类似于cmd.exe
的/ c命令行选项
答案 0 :(得分:2)
简短的回答是不幸的。 WScript Engine没有提供通过管道传递脚本或通过命令参数传递脚本的方法,唯一的选择是使用StdIn
来解释和处理命令(在下面展开)。 / p>
StdIn
从命令行解释和执行Code Direct 不确定自己,但想要测试一下......
值得注意的是,下面的测试仍然需要一个脚本来解释输入,这可能不符合要求但是非常通用我不会把它当作临时脚本。
我可以看到的问题是,您希望传递的代码越复杂,就越难以通过cscript.exe
程序。
以下是一个简单的示例,只需将MsgBox()
调用cscript.exe
。
命令行:
echo MsgBox("test piping") | cscript.exe /nologo "test.vbs"
test.vbs
Dim stdin: Set stdin = WScript.StdIn
Dim line: line = stdin.ReadAll
Call ExecuteGlobal(line)
在命令行上处理多行
从echo
管道多行不是一件容易的事情,如果你使用一个字符作为分隔符来传递命令,那么它可能会更好。例如,
echo MsgBox("test piping")^^^^Msgbox("test Complete") | cscript.exe /nologo "test.vbs"
然后使用
Split(stdin.ReadAll, "^")
分解要执行的命令行。
这是一个更复杂的例子;
命令行:
echo Dim i: i = 1^^^^i = i + 2^^^^MsgBox("i = " ^^^& i) | cscript /nologo "test.vbs"
test.vbs
的内容:
Dim line Dim stdin: Set stdin = WScript.StdIn
For Each line In Split(stdin.ReadAll, "^")
'Takes each line from StdIn and executes it.
Call ExecuteGlobal(line)
Next
击> <击> 撞击>
使用^
作为分隔符为我自己制作了一根杆,因为它在命令行中具有特殊含义,需要进行转义(恰好是^
) ,以及在管道传输时必须再次转义的事实,因此^^^^
。
意识到断开行并单独执行它们会导致更多问题(例如Function
定义会失败)。这让我重新思考这种方法,发现它应该更简单。
Dim stdin: Set stdin = WScript.StdIn
Dim input: input = Replace(stdin.ReadAll, "^", vbCrLf)
Call ExecuteGlobal(input)
答案 1 :(得分:0)
我一直在寻找一种将脚本传递到wscript(实际上是cscript)以在Windows服务关闭期间执行可能长时间运行的任务的方法,并且不想等待它完成以删除临时脚本文件。我决定让脚本在完成后删除文件本身:
' do work
Set objShell = CreateObject("Wscript.Shell")
strPath = Wscript.ScriptFullName
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile(strPath)