是否可以pipe脚本到WScript?

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

我没有find一个命令行选项来读取脚本forms的标准inputstream,但我没有发现在WWW的几个地方,文件的WScript错误消息“无法从标准input读取脚本”。

MSDN Windows脚本主机参考 – 错误消息

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

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

Solutions Collecting From Web of "是否可以pipe脚本到WScript?"

简短的答案是不幸的。 WScript引擎不提供通过管道或通过命令参数传递脚本的方法,唯一的选择是使用StdIn来解释和处理命令(展开在下面)


使用StdIn解释并从命令行执行代码直接

不确定自己,但想要测试出来…

值得注意的是,下面的测试仍然需要一个脚本来解释输入可能不符合要求,但如此通用,我不会把它作为临时脚本。

我可以看到的问题是你想传递的代码越复杂,通过传递给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)