是否可以将脚本传递给WScript?

时间:2016-04-06 06:59:51

标签: windows stdin wsh

我想使用Windows脚本宿主(wscript.exe或cscript.exe)执行我的应用程序生成的简单VBScript / JScript,而不生成临时脚本文件。

我没有找到命令行选项来从标准输入流中读取脚本,但我确实在WWW中找到了几个记录WScript错误消息“无法从stdin读取脚本”的地方。

MSDN Windows Script Host Reference - Error Messages

是否有一个隐藏的命令行选项来从标准中读取脚本?

目前我的程序生成一个小脚本并将其写入临时文件。然后它创建一个运行cscript.exe的子进程,等待它完成,然后再次删除临时文件。我想摆脱临时文件并将脚本直接传递给脚本主机,如果可能的话。 (例如,将其传递给cscript.exe或将其作为命令行参数的一部分传递,类似于cmd.exe的/ c命令行选项

2 个答案:

答案 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)