脚本优化

时间:2017-03-16 02:05:51

标签: tcl wsh

我有一些问题:

  1. 如何支持报价;设置数据"(" C:\ text.txt",True)"。

  2. 请修改以下代码以便更快地进行优化。

  3. 如何在继续或阅读此文件之前保留或暂停创建txt文件。

  4. set A_mark   {"}
    set B_mark   {(}
    set C_mark   {)}
    set D_mark   {,}
    set path     [pwd]
    set pathFile [file join $path text.txt]
    set strgdt   [join [list "Set objFile = objFSO.CreateTextFile" "$B_mark$A_mark$pathFile$A_mark$D_mark True$C_mark"] ""]
    
    #HERE THE FIRST QUESTIONS
    #I would like to write the format string example like this: Set objFile = objFSO.CreateTextFile("C:\text.txt", True)
    
    set vbs [list \
            {On Error Resume Next} \
            {Const wbemFlagReturnImmediately = &h10} \
            {Const wbemFlagForwardOnly = &h20} \
            {Dim objFSO, objFile} \
            {Set objFSO = CreateObject("Scripting.FileSystemObject")} \
            "$strgdt" \ ;#The variable from above
            #so on..
            ]
    
    #Write the vbsFile
    set oFile [open "vscr.vbs" w]
    
    #Run the vbs file then create a txt file
    set res [exec {cmd.exe /c [file join $path vbscrpting.vbs]}]
    
    #HERE THE SECOND QUESTIONS
    #How to make sure the file already created and if the txt file still on processing then wait until finish create it.
    
    #Open txt file
    set txtFile [open "text.txt" r]
    

1 个答案:

答案 0 :(得分:0)

关于第一个问题,只需使用模板:

set script [format {
    On Error Resume Next
    Const wbemFlagReturnImmediately = &h10
    Const wbemFlagForwardOnly = &h20
    Dim objFSO, objFile
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.CreateTextFile("%s", True)
    # So on
} $pathFile]

然后,您需要实际脚本写入脚本文件。 您正在打开脚本文件但不写任何内容。 做类似的事情:

set sfname [file join $path myscript.vbs]
set fd [open $sfname w]
puts $fd $script
close $fd

然后调用解释器。 没有必要走很长的路 - 就像你所做的那样 - 通过往返 通过cmd.exe,最终会调用ShelleExecuteEx() Win32 API调用以确定如何处理.vbs文件, - 只是 打电话给interpterer:

set res [exec [list cscript.exe /nologo $sfname]]

exec完成时,这意味着WSH解释器也完成了, 所以它应该(重新)写入的文本文件被创建 - 除非 解释器检测到在提供的脚本中运行任何命令时出错 在调用objFSO.CreateTextFile()之前或处理时调用它 那个电话。

因此,您需要真正了解exec来电的执行情况 通过做像

这样的事情
set rc [catch [list exec [list cscript.exe /nologo $sfname]] out]
if {$rc != 0} {
  puts stderr "WSH script failed: $out"
  exit 42
}

我建议你参考一下 catch manualexec manual

我还会考虑删除WSH脚本的目标文件 在执行它之前处理 - 从您的Tcl脚本或从 WSH脚本 - 是一个很好的做法。 请确保您已准备好在该文件不存在的情况下 你正在处理这件事。

请注意,我认为问题导致您提出第二个问题 可能与您没有将脚本写入脚本文件有关 因此它最终变为空,因此称为WSH解释器 它什么也不做,马上就放弃了。

一方面注意,我明确地称为cscript.exe,它是一个命令行WSH解释器。使用它的一个好处是,如果它检测到 和错误,它在退出之前将其写入标准错误流, 并exec读取该数据并将其返回给您的脚本。 缺点是执行cscript.exe弹出一个控制台窗口 - 除非您的Tcl脚本由tclsh运行,因此已由托管 控制台流程。

您可以使用wscript.exe代替cscript.exe:它是“窗口”版本 WSH解释器。它不会弹出控制台窗口,而是作为回报 它显示它使用愚蠢的GUI窗口检测到的任何错误,其中有人必须单击“确定”按钮让解释器死亡。这很傻 对于非互动的东西。

当您“只执行”WSH脚本时,

wscript.exe默认运行。

所以请你选择。