Что касается первого вопроса, просто используйте шаблоны:
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