Оптимизация скрипта

У меня есть несколько вопросов:

  1. Как поддержать котировки; установить данные "(" C: \ text.txt ", True)".

  2. Измените приведенный ниже код, чтобы ускорить процесс оптимизации.

  3. Как удерживать или приостанавливать, пока текстовый файл не будет создан, прежде чем продолжить или прочитать этот файл.

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]

person Adreas Martino    schedule 16.03.2017    source источник


Ответы (1)


Что касается первого вопроса, просто используйте шаблоны:

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, просто вызовите интерптератор:

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 руководству и _ 12_ руководство.

Я бы также подумал об удалении целевого файла для сценария WSH, который будет обрабатывать перед выполнением итерации либо из вашего сценария Tcl, либо из сценария WSH, что будет хорошей практикой. Будьте готовы к тому, что этот файл не существует, когда будете иметь дело с этим.


Обратите внимание: я полагаю, что проблема, которая привела к тому, что вы задали второй вопрос, вероятно, связана с тем, что вы не записали сценарий в файл сценария, так что он оказался пустым, и, следовательно, интерпретатор WSH вызвал его, ничего не делая, и сразу же завершил работу.

С одной стороны, я явно назвал cscript.exe, который является интерпретатором WSH командной строки. Дополнительным преимуществом его использования является то, что в случае обнаружения и ошибки он записывает его в свой стандартный поток ошибок перед выходом, а exec считывает эти данные и возвращает их вашему скрипту. Обратной стороной является то, что выполнение cscript.exe вызывает всплывающее окно консоли, если ваш сценарий Tcl не запущен tclsh и, следовательно, уже размещен консольным процессом.

Вы можете использовать wscript.exe вместо cscript.exe: это "оконная" версия интерпретатора WSH. Он не всплывает в консольном окне, но, в свою очередь, отображает все ошибки, которые он обнаруживает с помощью глупого окна графического интерфейса, в котором кто-то должен нажать кнопку «ОК», чтобы интерпретатор умер. что очень глупо для неинтерактивных вещей.

wscript.exe запускается по умолчанию, когда вы "просто выполняете" сценарии WSH.

Так что выбирайте.

person kostix    schedule 16.03.2017