2017-08-30 64 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'並進行處理。不過,我想操縱在我的C#Winform中使用此vbs腳本顯示結果的標籤。因此我需要將控制權交給它。

我該怎麼做?

我還沒有找到解決方案,我希望你能給我一個提示。

+0

您無法傳遞對控件的引用,但可以使vb腳本返回一個值並將其分配給調用應用程序中的控件。或者使用任何其他方式進行進程間通信,甚至是臨時文件,命名管道等等,只需一個簡單的方法即可看到重複。 – dlatikay

+0

那麼這意味着我必須處理C#代碼中的返回值。這意味着我必須涵蓋可能會返回的所有情況。這可能是一個非常大的數字。我不想交換ascii文件。我計劃通過控制/或其處理,以便VB腳本可以操縱它自己。在使用WScript和CScript有關返回值方面也有所不同。 – SUM

+0

您不必在C#中覆蓋任何案例或執行*「計算」*。無論您計劃如何使用VBScript *在控件*上顯示,只需將其寫入標準輸出,然後從C#讀取輸出並將其顯示在控件上即可。 **您是否在@Smartis發佈的鏈接中檢查了答案** –

回答

0

好吧,我已經寫了一個解決方案: 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#代碼中進一步處理它。不是我一開始就在尋找的東西,但我認爲我可以用它來工作。

只有一個值是很好的。對於一組值,我必須解析它們才能正確使用它。

謝謝。