2017-08-30 17 views
-1

.NET C#Winformsプロジェクトが正常に動作します。VBスクリプトによる操作コントロール

私がしたいことは、VBスクリプトを実行するプロセスを作成することです。私はすでに次のコードでそれを達成しました:

string ScriptName = "myScript.vbs"; 

Process ScriptProcess = new Process(); 
ScriptProcess.StartInfo.FileName = @ScriptName; 
ScriptProcess.StartInfo.WorkingDirectory = @"C:\scripts\"; 
ScriptProcess.StartInfo.Arguments = string.Format("\"{0}\" \"{1}\"","Arg1","Arg2"); 
ScriptProcess.Start(); 
ScriptProcess.WaitForExit(); 
ScriptProcess.Close(); 

引数は 'myScript.vbs'に渡され、処理されます。しかし、私は操作したいと思った。このvbsスクリプトを使用して結果を表示するための私のC#Winformのラベル。したがって、私は何とかそれにコントロールを渡す必要があります。

どうすればいいですか?

解決策を見つけられませんでした。私はあなたに私にヒントを与えることができれば幸いです。

+0

コントロールへの参照を渡すことはできませんが、vbスクリプトで値を返し、呼び出し元アプリケーションのコントロールに割り当てることができます。一時的なファイル、名前付きパイプなどの他のプロセス間通信の手段を使用することもできます。 – dlatikay

+0

これは、C#コードの戻り値を処理する必要があることを意味します。これは、返す可能性のあるすべてのケースをカバーする必要があることを意味します。これは非常に大きな数になります。私はアスキーファイルを交換したくありません。私はVBスクリプトがそれ自身を操作できるように、コントロール/またはそのハンドルを渡すことを計画しました。また、WScriptとCScriptを使用して値を返す方法との違いもあります。 – SUM

+0

C#では、どのケースもカバーしたり、* "計算" *を行う必要はありません。 VBScript *からコントロール*に表示することを計画しているものは、代わりに標準出力に書き出してから、C#から出力を読み込んでコントロールに表示することができます。 ** @Smartisによって投稿されたリンクの答えを確認しましたか?** –

答えて

0

[OK]を、私は解決策を書いた: C#コード:

Process p = new Process(); 
p.StartInfo = new ProcessStartInfo("cscript"); 
p.startInfo.UseShellExecute = false; 
p.startInfo.RedirectStandardOutput= true; 
p.startInfo.RedirectStandardError= true; 

var outputWriter = new StringWriter(); 
p.OutputDataReceived += (sender, args) => outputWriter.WriteLine(args.Data); 
var errorWriter = new StringWriter(); 
p.ErrorDataReceived += (sender, args) => errorWriter.WriteLine(args.Data) 

p.StartInfo.Arguments = string.Format("//Nologo C:\\scripts\myscript.vbs "\"{0} \"{1}"",x,y); 

OutputWriter.NewLine =""; 
errorWriter.NewLine =""; 

p.Start(); 
p.BeginOutputReadLine(); 
p.BeginErrorReadLine(); 
p.WaitForExit(); 

//Just to see output and errors coming back. 
Console.WriteLine(outputWriter.GetStringBuilder().ToString()); 
Console.WriteLine(errorWriter.GetStringBuilder().ToString()); 

p.Close(); 
p.Dispose(); 

私のVBスクリプトは、私はちょうどそれの重要な部分を掲示同じになります。コード@STLDeveloper は大丈夫でした。

Dim Arg, var1, var2 
Set Arg = WScript.Arguments 

Set objStdOut = WScript.StdOut 
Set objStdErr = WScript.StdErr 

var1 = Arg(0) 
var2 = Arg(1) 

if var2 = 2 then 
**do stuff** 
objStdOut.Write "Msg 1" 
End if 

set Arg = Nothing 

私はリンク(Smartisによって掲載された)のコードで、私は困難に遭遇したことを言及したいと思います。

しかし、私はパラメータを渡すことができ、出力/結果を取得して、これをさらにC#コードで処理することができます。私が最初に探していたものではありませんが、私はそれで作業できると思います。

ただ1つの値のために良いです。値のセットについては、適切に使用するためにそれらを解析する必要があります。

ありがとうございました。

関連する問題