2016-04-07 10 views
1

申し訳ありませんが、私はフォーラムやGoogleでこのスクリプトを書こうと数時間を費やしましたが、私はあまりにも多くの悩みやフランケンシュタインのコードに異常があると思います。VBScript CMDプロンプトと非同期で対話する

私は実行しようとしており、他のファイルをスキャンしてフィードバックとプロンプトを表示する実行可能ファイルです。手動でコマンドプロンプトでこれを実行し、最初のスキャンを行い、何をしたいかを尋ね、修復を実行して(5分以上かかることがある)、再度実行するか閉じるように促します。

擬似コードは次のようになります。

  • 実行EXE ArchiveFileのConfigFile
  • ため
  • 待ち "のコマンドを入力します。>" のための
  • タイプ1
  • 待ち "のコマンドを入力します。>"
  • タイプ7
  • "印刷先を入力してください"を待ちます
  • タイプ2
  • 待ちここ

を完了 "コマンドを入力します>"

  • タイプ9
  • が私の実際のコード

    'Cycle through each iha file in the chosen folder 
    for each objFile in objFSO.GetFolder(archiveFolder).files 
    If LCase(objFSO.GetExtensionName(objFile.Name)) = "iha" Then 
        'run the iharchiveInfo.exe with the chosen config and the current archive 
         msgbox(chr(34) & exeFile & chr(34) & " " & chr(34) & objfile.path & chr(34) & " " & chr(34) & ArchiveConfig & chr(34)) 
         set oExec = Shell.exec("cmd.exe /k "& chr(34) & exeFile & " " & chr(34) & objfile.path & chr(34) & " " & chr(34) & ArchiveConfig) 
         do while Not oExec.StdOut.AtEndOfStream 
          MsgBox oExec.stdout.Readline 
         Loop 
         Msgbox("second line") 
         oExec.stdin.write chr(34) & exeFile & " " & chr(34) & objfile.path & chr(34) & " " & chr(34) & ArchiveConfig 
         Do While oExec.Status = 0 
          WScript.Sleep 100 
          WScript.StdOut.Write(oExec.StdOut.ReadAll()) 
          WScript.StdErr.Write(oExec.StdErr.ReadAll()) 
         Loop 
         msgbox ("write") 
         oExec.stdin.write 1 
         do while Not oExec.StdOut.AtEndOfStream 
          MsgBox oExec.stdOut.Readline 
         Loop 
         oExec.stdin.write 7 
    exit for 
    end if 
    next 
    

    であるためにそれはプロンプトcmdを開きますが、私はとのメッセージボックスを取得することはありません読み込まれた行。代わりに、私がcmdプロンプトを閉じると、次にmsgboxの書き込みを取得します。

  • +0

    コマンドプロンプトでは、cscript.exeを使用して、コマンドプロンプト以外のプロンプトwscript.exeではなく、vbscriptsを実行します。 Wscriptは、vbsスクリプトのデフォルトプログラムです。ですから、 'cscript // nologo" c:\ script.vbs "'を指定する必要があります。ヘルプは 'cscript /?'を参照してください。 –

    +0

    私はwscript atmを使用しています。私はその違いによってちょっと混乱していて、どちらが適切であるか自分自身と議論してきました。この例ではwscriptを使用し、cscriptとwscriptでしか動作しないと言うmsdnサイトではもっと混乱します。 https://msdn.microsoft.com/en-us/library/skwz6sz4(v=vs.84).aspx – Furbs

    +0

    Cscriptはコンソールプログラムです。 WscriptはGUIプログラムです。コンソールプログラムは自動的にコンソールを取得します。 –

    答えて

    0

    ストリームの終わりに到達するまで、コマンドを起動した後に行う最初のことは、出力ライン・バイ・ラインを読まれる:

    Do While Not oExec.StdOut.AtEndOfStream 
        MsgBox oExec.stdout.Readline 
    Loop 
    

    をしかし、ときcmd終了のみ発生していることこれは、パラメータ/kで開始したためです。したがって、デッドロックが発生しました。同じループが次のループでReadAllになります。実際の出力が使用される内容に応じて

    いずれかReadLineあなたが読んで停止したい行全体

    Do 
        line = oExec.StdOut.ReadLine 
    Loop Until line = "something" 
    

    かの条件が満たされるまでRead単一の文字、例えば読み取ることができた場合:

    str = "" 
    Do 
        str = str & oExec.StdOut.Read(1) 
    Loop Until str = "something" 
    

    また、oExec.Status <> 0のプロセスが既に終了しているので、StdInへの書き込みはもはや機能しません。ディスクリプタがまだ開いている場所(つまり、oExec.Status = 0)のどこかで書き込み操作を行う必要があります。

    +0

    情報ありがとうございます。私が/ kを使うべきではないのであれば、代わりに何を使うことができますか?また、should should the line 'message = readoutput(oExec)' は、「コマンドを入力してください」という文字列が表示されるまで、あなたが説明したことを達成し、すべてのreadlineを表示しますか?それは私がcscriptの代わりにwscriptを使っているからですか?私は、コマンドウィンドウを閉じると、wscriptのCPU使用率が最大になることに気付きますが、私はフィードバックを見ません。 – Furbs

    +0

    '/ c'を使うか、パラメータを完全に削除してください。 VBScriptには 'readoutput()'という関数はありません。 'wscript'ではなく' cscript'を使ってもそれは変わりません。 –

    +0

    私はそこにあるサブ関数のように、ReadOutputを意味します。 '関数ReadOutput(P) \t薄暗いテキスト テキスト= "" ですかまで右(テキスト、レン( "")=>コマンドを入力します。) ">コマンドを入力し、" テキスト=テキスト&p.StdOut.Readline ループ ReadOutput = text 終了関数 ' パラメータを完全に削除すると、stdin.writeを使用してコマンドを正しく発行できますか?空白のcmdプロンプトの代わりに何が起きているのかを確認する方法はありますか?先週、 '> con'というパラメータを追加するとメッセージを見ることができたようですが、今日はもう動作しません。 編集:スクリプトをスクリプトとして表示しようとしています – Furbs

    関連する問題