我有一些问题:
如何支持报价;设置数据"(" C:\ text.txt",True)"。
请修改以下代码以便更快地进行优化。
如何在继续或阅读此文件之前保留或暂停创建txt文件。
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]
答案 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
manual
和exec
manual。
我还会考虑删除WSH脚本的目标文件 在执行它之前处理 - 从您的Tcl脚本或从 WSH脚本 - 是一个很好的做法。 请确保您已准备好在该文件不存在的情况下 你正在处理这件事。
请注意,我认为问题导致您提出第二个问题 可能与您没有将脚本写入脚本文件有关 因此它最终变为空,因此称为WSH解释器 它什么也不做,马上就放弃了。
一方面注意,我明确地称为cscript.exe
,它是一个命令行WSH解释器。使用它的一个好处是,如果它检测到
和错误,它在退出之前将其写入标准错误流,
并exec
读取该数据并将其返回给您的脚本。
缺点是执行cscript.exe
弹出一个控制台窗口 -
除非您的Tcl脚本由tclsh
运行,因此已由托管
控制台流程。
您可以使用wscript.exe
代替cscript.exe
:它是“窗口”版本
WSH解释器。它不会弹出控制台窗口,而是作为回报
它显示它使用愚蠢的GUI窗口检测到的任何错误,其中有人必须单击“确定”按钮让解释器死亡。这很傻
对于非互动的东西。
wscript.exe
默认运行。
所以请你选择。