2017-01-11 9 views
0

ByRefを使用してVBスクリプト(スクリプトA)内のVBスクリプト(スクリプトB)を呼び出しています。VBスクリプト内で呼び出されるVBスクリプト

  1. スクリプトAは、Bを呼び出す前に他の複数のスクリプトを呼び出して動作します。
  2. すべてのスクリプトは同じフォルダに置かれます。
  3. 問題は、Bが呼び出されていないことです。
  4. Bをダブルクリックすると、正常に動作します。

次のようにデバッグしました。

  1. MsgBoxをBの直前または直後に配置してデバッグしようとしました。また、Bの最初のステートメントとしては表示されません。
  2. 正しいスクリプトパスが呼び出されているかどうかを確認するために、Bを削除し、スクリプトAがハングしました。

私は何が問題なのか分かりませんが、困惑し、奇妙です!

問題を解決する方法を教えてください。


私の謝罪を更新しました!スクリプト全体を投稿するにはあまりにも多くのコード行があります。したがって、投稿されたテキストの説明。ここにコードからのスニペットがあります。

注スクリプトBのコールが表示される前に

  1. MsgBoxだけで罰金!
  2. MsgBoxスクリプトBの直後に「returnCode」が空白であることだけが表示されます。スクリプトB(最初の行)の
  3. MsgBoxが表示されません。

スクリプトA

'... 
'... 

MsgBox "ready to execute Script B" 

If swPrint Then 
    cmdExecute = RootDir & "Scripts\Master\Application\" & ScriptB & " //B " & _ 
    "-JOB=" & strJobNumber & " " & "-APP=" & strApp & strEnv & strMRO & strZIP & " " & "-QAPDF=" & strQAPDF & " " & "-QAPRNT=" & strQAPRNT 
    MsgBox "execute Script B " & cmdExecute 
    ExecuteStep cmdExecute 
    MsgBox "back from Script B " & ReturnCode 
End If 


Public Sub ExecuteStep(ByRef ExecCommandLine) 
    If swStartStop Then 
     ReturnCode = VSShell.Run(ExecCommandLine, , True) 
     CheckForError ReturnCode, intStep, ExecCommandLine 
    End If 
End Sub 

スクリプトB

MsgBox "in Script B" 
'.... 
'.... 

この覗くであなたの時間を感謝しています。これらのスニペットが意味をなさない場合はお知らせください。ありがとうございました。それでもフォーラムでの編集に慣れ


。 @omegastripesがメッセージを編集するのに時間がかかることを賞賛します。

"MsgBox"の出力では、スクリプトB "& cmdExecute"が実行される限り、パラメータ付きスクリプトBファイルへのパス以外は何もありません。これらは、スクリプトBより前のすべてのスクリプトに渡されるパラメータと同じです。

\\ ScriptB -Parameter1 -PARAMTER2は...ありがとうございました。あなたはExecuteStepからReturnCodeを返送する場合は、その機能にする必要があり

+0

あなたは実際のコードを含めることはできますか?テキストの説明は素晴らしいですが、誰もプログラムを見ずにプログラミングエラーを指摘することができると思いますか? – Tomalak

+1

こんにちはと歓迎するスタックオーバーフロー。あなたが[mcve]を提供しないと、あなたを助けるのは難しいです。そして、いない場合でも、テスト1によると、「'MsgBox' Bを呼び出す前に」が表示され、私は問題はその前にある必要がありますので、あなたのコードでもその部分に到達しないと仮定します。あなたが問題のあるコード –

+0

を共有している場合いずれにせよ、我々は唯一の問題を編集し、ライン 'のMsgBox&cmdExecute'「ScriptBを実行」からの出力を追加してください、あなたを支援することができます。 – omegastripes

答えて

0

ポイント1.

:次に

Function ExecuteStep(ExecCommandLine) 
    If swStartStop Then 
     ReturnCode = VSShell.Run(ExecCommandLine, , True) 
     CheckForError ReturnCode, intStep, ExecCommandLine 
    End If 
    ExecuteStep = ReturnCode 
End Function 

If swPrint Then 
    ... 
    ... 
    ' This will call ExecuteStep and pass back the ReturnCode 
    ' ---------------------------------------------------------- 
    MsgBox "back from Script B " & ExecuteStep(cmdExecute) 
End If 

ポイント2

スクリプトBが呼び出されていないと思われるのは、swStartStopは、エラーまたは入力ミスのためにFalseと評価されています。それはあなたのスクリプトの先頭にOption Explicitを使う方が良いでしょう、これは宣言するすべての変数を(dimを)あなたを強制され、実行時にタイプミスを引き上げます。また、必要なすべての変数を引数として関数に渡して、データの流れをより明確にします。

Function ExecuteStep(ExecCommandLine, swStartStop) 
関連する問題