使用VBScript的批处理回显命令的等效功能是什么?

使用VBScript的批处理回显命令的等效功能是什么?,vbscript,Vbscript,我们目前使用Windows批处理(DOS)命令文件来控制流程。要向控制台显示消息,我们将使用ECHO命令。这些消息将显示在我们的调度程序软件中,该软件以前是Tivoli,现在是CA WA Workstation\ESP 我想开始使用VBS文件而不是CMD\BAT文件,并试图找出如何对控制台进行等效的回显 当我尝试使用WScript.Echo命令或write to Standard Out时,这两个命令的消息都显示在对话框中,需要按下OK按钮才能继续。毫不奇怪,当我通过调度器在无人参与的情况下运行

我们目前使用Windows批处理(DOS)命令文件来控制流程。要向控制台显示消息,我们将使用ECHO命令。这些消息将显示在我们的调度程序软件中,该软件以前是Tivoli,现在是CA WA Workstation\ESP

我想开始使用VBS文件而不是CMD\BAT文件,并试图找出如何对控制台进行等效的回显

当我尝试使用WScript.Echo命令或write to Standard Out时,这两个命令的消息都显示在对话框中,需要按下OK按钮才能继续。毫不奇怪,当我通过调度器在无人参与的情况下运行时,作业会点击其中一个命令并挂起,因为没有人确定messagebox

SET FS = CreateObject("Scripting.FileSystemObject")
SET StdOut = FS.GetStandardStream(1)
StdOut.Write("Test 1")

WScript.echo("Test 2")
我意识到我可以使用脚本对象将消息写入日志文件,但如果提供的路径无效或权限不足,则可能会失败。此外,能够在调度程序中看到反馈写入非常方便


如何使用VBScript写入控制台?我在这里看到的其他帖子表明,上述方法由于上面描述的原因不起作用,是实现这一点的方法。

wscript.echo是正确的命令-但要输出到控制台而不是对话,您需要使用cscript而不是wscript运行脚本

您可以通过以下方式解决此问题:

  • 从命令行运行脚本,如下所示:

    cscript myscript.vbs
    
  • 更改默认文件关联(或为要使用cscript运行的脚本创建新的文件扩展名和关联)

  • 通过脚本主机选项更改引擎(即根据)

  • 或者,您可以在脚本的开头添加几行,强制它将“引擎”从wscript切换到cscript-请参阅(复制如下):

    RunMeAsCScript
    "想干什么就干什么,;在上面这一行之后的任何事情你都可以看到,你将在cscript中
    子RunMeAsCScript()
    暗带、strCmd、strEngine、i、objDebug、wshShell
    设置wshShell=CreateObject(“WScript.Shell”)
    strEngine=UCase(右(WScript.FullName,12))
    如果strEngine“\CSCRIPT.EXE”,则
    '重新创建命令行参数列表
    strArgs=“”
    如果WScript.Arguments.Count>0,则
    对于i=0到WScript.Arguments.Count
    strArgs=strArgs&“eit(WScript.Arguments(i))
    下一个
    如果结束
    '创建完整的命令行以在CSCRIPT中重新运行此脚本
    strCmd=“CSCRIPT.EXE//NoLogo”“”和WScript.ScriptFullName&”“”和strArgs
    '在CSCRIPT中重新运行脚本
    设置objDebug=wshShell.Exec(strCmd)
    '等待脚本退出
    当objDebug.Status=0时执行
    WScript.Sleep 100
    环
    '使用CSCRIPT的返回代码退出
    WScript.Quit objDebug.ExitCode
    如果结束
    端接头
    根据Tomasz Gandor的评论,这将确保报价中的参数包括:
    函数QuoteIt(strTemp)
    如果仪表(strTemp,“”),则
    strTemp=“”&替换(strTemp“,”和“
    如果结束
    QuoteIt=strTemp
    端函数
    

我强烈建议切换到PowerShell而不是VBScript。我在这里遇到了同样的问题,使用JS。在那里,wscript/cscript的检查更加优雅:
if(!wscript.FullName.match(“cscript.exe”){…}
。(或者在regexp中添加一个
$
,以防万一)。我没有重新运行脚本,只是根据使用的引擎更改详细程度。顺便说一句,在上面的例子中:参数转义/引用如何?它是否适用于包含空格的参数?啊哈!好的一点——我刚刚从引用的站点复制并粘贴了代码——现在已经找到了该场景的快速修复方法(即添加QuoteIt函数)。在JS前端也有不错的提示。感谢@TomaszGandor@JohnLBevan-0.499设计了QuoteIt函数(使用全局WScript.Arguments(i)而不是传递的参数strTemp)。@Ekkehard.Horner很好的观点-抱歉,很快就把它打乱了,然后进行了重构以使其他人更容易阅读,但错过了这一点。指出你发现了它。
cscript //h:cscript //s
RunMeAsCScript

'do whatever you want; anything after the above line you can gaurentee you'll be in cscript 

Sub RunMeAsCScript()
        Dim strArgs, strCmd, strEngine, i, objDebug, wshShell
        Set wshShell = CreateObject( "WScript.Shell" )
        strEngine = UCase( Right( WScript.FullName, 12 ) )
        If strEngine <> "\CSCRIPT.EXE" Then
                ' Recreate the list of command line arguments
                strArgs = ""
                If WScript.Arguments.Count > 0 Then
                        For i = 0 To WScript.Arguments.Count
                                strArgs = strArgs & " " & QuoteIt(WScript.Arguments(i)) 
                        Next
                End If
                ' Create the complete command line to rerun this script in CSCRIPT
                strCmd = "CSCRIPT.EXE //NoLogo """ & WScript.ScriptFullName & """" & strArgs
                ' Rerun the script in CSCRIPT
                Set objDebug = wshShell.Exec( strCmd )
                ' Wait until the script exits
                Do While objDebug.Status = 0
                        WScript.Sleep 100
                Loop
                ' Exit with CSCRIPT's return code
                WScript.Quit objDebug.ExitCode
        End If
End Sub

'per Tomasz Gandor's comment, this will ensure parameters in quotes are covered:
function QuoteIt(strTemp) 
        if instr(strTemp," ") then
                strTemp = """" & replace(strTemp,"""","""""") & """"
        end if
        QuoteIt = strTemp
end function