Windows 是否可以将脚本通过管道传输到WScript?

Windows 是否可以将脚本通过管道传输到WScript?,windows,stdin,wsh,Windows,Stdin,Wsh,我希望使用Windows脚本主机(wscript.exe或cscript.exe)执行应用程序生成的简单VBScript/JScript,而不生成临时脚本文件 我没有找到从标准输入流读取脚本的命令行选项,但我确实在WWW中找到了几个地方记录了WScript错误消息“无法从stdin读取脚本” 那么,是否有一个隐藏的命令行选项来从标准中读取脚本 目前,我的程序生成一个小脚本并将其写入一个临时文件。然后它创建一个子进程运行cscript.exe,等待它完成,然后再次删除临时文件。如果可能的话,我想

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

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

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


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

很遗憾,简短的回答是否定的。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
尺寸线:线=stdin.ReadAll
调用ExecuteGlobal(行)
在命令行上处理多行

echo
导出多行代码并非易事,如果在传入命令后使用字符作为分隔符来分隔命令,效果可能会更好。比如说,

echo MsgBox(“测试管道”)^^^^MsgBox(“测试完成”)| 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
对于拆分中的每一行(stdin.ReadAll,“^”)
'从StdIn获取每一行并执行它。
调用ExecuteGlobal(行)
下一个

通过使用
^
作为分隔符,为我自己的背部制作了一根杆,因为这在命令行中有特殊的意义,需要转义(恰好是
^
),加上它在管道传输时必须再次转义,因此是
^^

意识到分解行并单独执行它们可能会导致更多问题(例如,
函数
定义将失败)。这让我重新思考了这个方法,发现它应该更简单

Dim stdin:Set stdin=WScript.stdin
尺寸输入:输入=替换(stdin.ReadAll,“^”,vbCrLf)
调用ExecuteGlobal(输入)

我正在寻找一种方法,将脚本通过管道传输到wscript(实际上是cscript),以便在Windows服务关闭期间执行一项可能长时间运行的任务,我不想为了删除临时脚本文件而等待它完成。我决定让脚本在完成时删除文件本身:

' do work
Set objShell = CreateObject("Wscript.Shell")
strPath = Wscript.ScriptFullName

Set objFSO = CreateObject("Scripting.FileSystemObject") 
objFSO.DeleteFile(strPath) 


你能举个例子吗?从什么生成vbscript?请多解释!您可以在当前进程中执行代码字符串,还是需要在新进程中运行?@AlexK。你能详细说明一下吗?我很感兴趣,你如何在没有临时文件的情况下将动态脚本传递给
cscript.exe
进程。我的意思是,如果代码不需要在单独的进程中运行,他可以通过.Execute或scriptcontrol在当前进程中运行他的字符串谢谢你的回答。但这并不能解决我的问题,因为我仍然需要生成test.vbs。我在寻找一个没有临时文件的解决方案,也就是说,根本没有持久化脚本文件。@niks那么答案是否定的。虽然您可以将其归类为临时文件,但它完全独立于从命令行传入的任何动态代码,并且它是最接近您将得到的解决方案。@niks我已更新了答案。很抱歉,我无法提供更多帮助。再次感谢您的回答。我接受了。“不”是我所期望的答案。我只是想知道是否有什么我错过了,因为链接的MSDN错误消息文档。非常好!在回答中使用一行代码:
ExecuteGlobal WScript.StdIn.ReadAll
。行拆分可以成批完成:
(ECHO WScript.ECHO“第1行”和ECHO WScript.ECHO“第2行”);CSCRIPT//NOLOGO EXEC.VBS