2012-11-02 5 views
9

現在Windowsバッチ(DOS)コマンドファイルを使用してプロセスフローを制御しています。コンソールにメッセージを表示するには、ECHOコマンドを使用します。これらのメッセージは、以前はTivoliであり、現在はCA WA Workstation \ ESPであるスケジューラー・ソフトウェアに表示されます。VBScriptを使用したバッチECHOコマンドに相当するものは何ですか?

私は、CMD \ BATファイルの代わりにVBSファイルを使いたいと思っています。コンソールにECHOをインストールする方法を理解しようとしています。

WScript.Echoコマンドを使用するか標準出力に書き込むと、両方のダイアログボックスにメッセージが表示され、[OK]ボタンを押し続ける必要があります。驚くことではありませんが、スケジューラを使用して無人で実行すると、ジョブはこれらのコマンドの1つをヒットし、メッセージボックスを確認する人がいないのでハングします。

SET FS = CreateObject("Scripting.FileSystemObject") 
SET StdOut = FS.GetStandardStream(1) 
StdOut.Write("Test 1") 

WScript.echo("Test 2") 

私は、スクリプトオブジェクトを使用して、ログファイルにメッセージを書くことができます実現が、無効なパスを提供するため、または十分な権限とされている場合、これは失敗する可能性があります。さらに、スケジューラ内のフィードバック書き込みを見ることができることは非常に便利です。

VBScriptを使用してコンソールに書き込む方法を教えてください。私は、上記の理由でうまくいかなかった上記の方法がそれを行う方法であることを示唆する他の投稿を見ました。

+0

私は強く、PowerShellの代わりにVBScriptのへの切り替えをお勧めします。 –

答えて

10

wscript.echoは正しいコマンドですが、ダイアログではなくコンソールに出力するには、wscriptの代わりにcscriptを使用してスクリプトを実行する必要があります。

あなたはそのようなコマンドラインからスクリプトを実行している

  • によってこの問題を解決することができます

    cscript myscript.vbs 
    
  • は、デフォルトのファイルの関連付けを変更する(またはそれらのスクリプト用の新しいファイル拡張子との関連付けを作成しますあなたはcscriptで実行したい)。

  • 変更スクリプトホスト・オプション(すなわちとしてhttp://support.microsoft.com/kb/245254あたり)を介してエンジン

    cscript //h:cscript //s 
    
  • それとものWScriptから「エンジン」を切り替えるには、それを強制するために、あなたのスクリプトの先頭に数行を追加することができますCSCRIPTする - http://www.robvanderwoude.com/vbstech_engine_force.php(以下コピー)を参照してください。

    RunMeAsCScript 
    
    'do whatever you want; anything after the above line you can gaurentee you'll be in cscript 
    
    Sub RunMeAsCScript() 
         Dim strArgs, strCmd, strEngine, i, objDebug, wshShell 
         Set wshShell = CreateObject("WScript.Shell") 
         strEngine = UCase(Right(WScript.FullName, 12)) 
         If strEngine <> "\CSCRIPT.EXE" Then 
           ' Recreate the list of command line arguments 
           strArgs = "" 
           If WScript.Arguments.Count > 0 Then 
             For i = 0 To WScript.Arguments.Count 
               strArgs = strArgs & " " & QuoteIt(WScript.Arguments(i)) 
             Next 
           End If 
           ' Create the complete command line to rerun this script in CSCRIPT 
           strCmd = "CSCRIPT.EXE //NoLogo """ & WScript.ScriptFullName & """" & strArgs 
           ' Rerun the script in CSCRIPT 
           Set objDebug = wshShell.Exec(strCmd) 
           ' Wait until the script exits 
           Do While objDebug.Status = 0 
             WScript.Sleep 100 
           Loop 
           ' Exit with CSCRIPT's return code 
           WScript.Quit objDebug.ExitCode 
         End If 
    End Sub 
    
    'per Tomasz Gandor's comment, this will ensure parameters in quotes are covered: 
    function QuoteIt(strTemp) 
         if instr(strTemp," ") then 
           strTemp = """" & replace(strTemp,"""","""""") & """" 
         end if 
         QuoteIt = strTemp 
    end function 
    
+2

JSを使って同じ問題が発生しました。 wscript/cscriptのチェックははるかにエレガントです: 'if(!WScript.FullName.match(" cscript.exe ")){...}'。 (場合によっては、 '$'を正規表現に追加することもできます)。私はスクリプトを再実行するのではなく、使用されるエンジンに応じて冗長性を変更するだけです。ところで、上の例では、引数エスケープ/クォートはどうですか?空白を含む引数でも動作しますか?ああ! –

+0

良い点 - 参照されたサイトからコードをコピーして貼り付けたので、そのシナリオのクイックフィックスをノックアップしました(つまり、QuoteIt関数を追加しました)。 JSフロントにもいいヒント。ありがとう@ TomaszGandor。 – JohnLBevan

+1

@ JohnLBevan -0.499 QuoteIt関数の設計(パラメータstrTempを渡す代わりにグローバルWScript.Arguments(i)を使用)。 –

関連する問題