2017-03-16 14 views
0

私はいくつかの質問があります:引用符をサポートするためにどのようにスクリプトの最適化

  1. を。 set data "(" C:\ text.txt "、True)"を選択します。

  2. 以下の最適化プロセスのコードを修正してください。

  3. このファイルを続行する前に、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

、単にテンプレートを使用します。

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 

次に、インタプリタを呼び出します。 あなたはラウンドトリップ結局.vbsファイルを処理する方法を見つけ出すためにShelleExecuteEx() のWin32 API呼び出しに呼び出しますcmd.exeて 、—だけ コール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スクリプトのターゲットファイルを削除することを検討します。 あなたがこれを扱っているときに、そのファイルが存在しない場合に備えてください。


私はあなたの2番目の質問 を尋ねるあなたにつながった問題は、おそらく、それが空で終わるようにスクリプトファイル にスクリプトを書いていないに関係していると仮定注と呼ばれる、その結果WSHインタープリタ は何もせずすぐに終了します。

私は、コマンドラインのWSHインタープリタであるcscript.exeを明示的に呼び出しています。 とエラーを検出すると、それを標準エラーストリームに書き出してから終了します。 とexecは、そのデータを読み込んでスクリプトに返します。 Tclスクリプトがtclshで実行されていて、コンソールプロセスで がすでにホストされている場合を除き、cscript.exeを実行するとコンソールウィンドウが表示され、— がポップされるという欠点があります。

cscript.exeの代わりにwscript.exeを使用することができます。これは、WSHインタープリタの「ウィンドウ」バージョン です。それはコンソールウィンドウをポップアップさせませんが、代わりに 愚かなGUIウィンドウを使用して検出されたエラーを表示します。このウィンドウでは、「OK」ボタンをクリックしてインタプリタが死ぬ必要があります。これは非対話的なもののために非常に愚かな です。

wscript.exeは、WSHスクリプトを「実行する」ときにデフォルトで実行されます。

だからあなたを選んでください。