========================================================================
方法1:直接調用
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "wscript";
proc.StartInfo.Arguments = " hello.js";
proc.StartInfo.UseShellExecute = false;
proc.Start();
方法2:
使用MS的Windows Script Control
string scr = "function hello(){var WshShell = new ActiveXObject(\"WScript.Shell\");"
+ "var code = \"WScript hello.js\";"
+ "WshShell.Exec(code);}";
MSScriptControl.ScriptControl sc = new ScriptControl();
sc.Language = "JScript";
sc.AllowUI = true;
sc.AddCode(scr);
object[] parameters = new Object[0];
sc.Run("hello", ref parameters);
出處:https://bbs.csdn.net/topics/340163504
==========================================================================================
public void RunVBScript() { string strPath = ""; System.Diagnostics.Process proc = new System.Diagnostics.Process(); string scriptPath = strPath + @"\\Driver\\driver.vbs";//可以是vbs文件或js文件 proc.StartInfo.FileName = "wscript"; proc.StartInfo.Arguments = scriptPath; proc.StartInfo.UseShellExecute = false; proc.Start(); proc.Close(); proc.Dispose(); } static private string RunCmd(string command) { System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = "cmd.exe"; //確定程序名 p.StartInfo.Arguments = "/c " + command; //確定程序命令行 p.StartInfo.UseShellExecute = false; //Shell的使用 p.StartInfo.RedirectStandardInput = true; //重定向輸入 p.StartInfo.RedirectStandardOutput = true; //重定向輸出 p.StartInfo.RedirectStandardError = true; //重定向輸出錯誤 p.StartInfo.CreateNoWindow = true; //設置置不顯示示窗口¿ p.Start(); //00 //p.StandardInput.WriteLine(command); //也可以用這種方式輸入入要行的命令 //p.StandardInput.WriteLine("exit"); //需要加上Exit要不然下一行程式 string res = p.StandardOutput.ReadToEnd(); //輸出出流取得命令行結果果 p.Close(); p.Dispose(); return res; }
參考:https://blog.csdn.net/hwm831002/article/details/8263699
===================================================================================================================
C#利用ScriptControl動態執行JS和VBS腳本
屬性名稱 |
類型 |
備注 |
AllowUI |
BOOL |
檢測是否允許運行用戶的接口元素。如果為False,則諸如消息框之類的界面元素不可見。 |
CodeObject |
Object |
腳本暴露給宿主調用的對象。只讀。 |
Modules |
Modules |
宿主提供給腳本的組件庫模塊。只讀。(COM組件通常都是以對象收集的形式向用戶提供可以留給用戶二次開發的對象集合,每一個收集即一個Modules) |
Language |
String |
設置或獲取腳本引擎解釋的語言,例如:VBScript、JScript。 |
Name |
String |
腳本引擎的名稱。只讀。 |
Procedures |
Procedures |
返回模塊中定義的過程的集合 |
SitehWnd |
HWND |
在腳本中顯示UI的父窗口句柄 |
State |
Enum |
設置或返回控件的狀態,如果為0,控件只執行語句但不轉發事件,為1則為加入的本控件接受的對象轉發事件。 |
Timeout |
Long |
控件的執行腳本的超時值,-1表示不超時 |
UseSafeSubset |
BOOL |
設置或返回宿主程序是否關心安全。宿主程序的安全級別可以從此屬性設置 |
Error |
Error |
錯誤對象,發生錯誤時,此屬性返回一個錯誤對象 |
方法名稱 |
參數 |
功能 |
AddCode |
Code As String |
往腳本引擎中加入要執行的腳本 |
AddObject |
Name As String, Object As Object, [AddMembers As Boolean = False] |
往腳本引擎加入一個對象,以便在腳本中可以使用該對象提供的方法等。 |
Eval |
Expression As String |
表達式求值 |
ExecuteStatement |
Statement As String |
解釋並執行腳本語句 |
Reset |
丟棄所有的對象和代碼,將State屬性置0。 |
|
Run |
ProcedureName As String, ParamArray Parameters() As Variant |
運行一個指定的過程 |
事件名稱 |
功能 |
Error |
有錯誤發生時激發該事件 |
TimeOut |
執行過程超時時發生 |
/* 添加COM引用:
Library MSScriptControl
C:\WINDOWS\system32\msscript.ocx
Microsoft Script Control 1.0
*/
例子:
using MSScriptControl;
namespace zz
{
/// <summary>
/// scriptengine類
/// </summary>
public class ScriptEngine
{
private ScriptControl msc;
/// <summary>
/// 構造函數
/// </summary>
/// <param name="language">腳本類型,VBscript\JavaScript</param>
public ScriptEngine(string language)
{
msc = new ScriptControlClass();
msc.UseSafeSubset = true;
msc.Language = language;
((DScriptControlSource_Event)msc).Error += new DScriptControlSource_ErrorEventHandler(ScriptEngine_Error);
((DScriptControlSource_Event)msc).Timeout += new DScriptControlSource_TimeoutEventHandler(ScriptEngine_Timeout);
}
/// <summary>
/// 運行eval方法
/// </summary>
/// <param name="expression">表達式</param>
/// <returns>返回值object</returns>
public object eval(string expression)
{
return msc.Eval(expression);
}
/// <summary>
/// 運行run方法
/// </summary>
/// <param name="mainfunctionname">入口函數名稱</param>
/// <param name="parameters">參數</param>
/// <returns>返回值object</returns>
public object Run(string mainFunctionName, object[] parameters)
{
return msc.Run(mainFunctionName, ref parameters);
}
/// <summary>
/// 加入要執行的腳本
/// </summary>
/// <param name="Code"></param>
public void AddCode(string Code)
{
msc.AddCode(Code);
}
/// <summary>
/// 解析並運行
/// </summary>
/// <param name="Code">代碼</param>
public void ExecuteStatement(string Code)
{
msc.ExecuteStatement(Code);
}
/// <summary>
/// 放棄所有已經添加到 scriptcontrol 中的 script 代碼和對象
/// </summary>
public void Reset()
{
msc.Reset();
}
/// <summary>
/// 獲取或設置腳本語言
/// </summary>
public string Language
{
get { return msc.Language; }
set { msc.Language = value; }
}
/// <summary>
/// 獲取或設置腳本執行時間,單位為毫秒
/// </summary>
public int Timeout
{
get { return ((IScriptControl)msc).Timeout; }
set { ((IScriptControl)msc).Timeout = value; }
}
/// <summary>
/// 設置是否顯示用戶界面元素
/// </summary>
public bool AllowUI
{
get { return msc.AllowUI; }
set { msc.AllowUI = value; }
}
/// <summary>
/// 宿主應用程序是否有保密性要求
/// </summary>
public bool UseSafeSubset
{
get { return msc.UseSafeSubset; }
set { msc.UseSafeSubset = true; }
}
private void ScriptEngine_Error()
{
//錯誤事件
}
private void ScriptEngine_Timeout()
{
//超時事件
}
}
}
出處:https://www.jb51.net/article/35314.htm
==============================================================================
解決方案
1.工程引用 Interop.MSScriptControl.dll
2.創建一個類,代碼如下:
using System.Collections.Generic;
using System.Text;
using MSScriptControl;
namespace myClass
{
/// <summary>
/// 腳本類型
/// </summary>
public enum ScriptLanguage
{
/// <summary>
/// JScript腳本語言
/// </summary>
JScript,
/// <summary>
/// VBscript腳本語言
/// </summary>
VBScript,
/// <summary>
/// JavaScript腳本語言
/// </summary>
JavaScript
}
/// <summary>
/// 腳本運行錯誤代理
/// </summary>
public delegate void RunErrorHandler();
/// <summary>
/// 腳本運行超時代理
/// </summary>
public delegate void RunTimeoutHandler();
/// <summary>
/// ScriptEngine類
/// </summary>
public class clsScriptEngine
{
private ScriptControl msc;
// 定義腳本運行錯誤事件
public event RunErrorHandler RunError;
// 定義腳本運行超時事件
public event RunTimeoutHandler RunTimeout;
/// <summary>
/// 構造函數
/// </summary>
public clsScriptEngine()
: this (ScriptLanguage.VBScript)
{
}
/// <summary>
/// 構造函數
/// </summary>
/// <param name="language"> 腳本類型 </param>
public clsScriptEngine(ScriptLanguage language)
{
this .msc = new ScriptControlClass();
// this.msc.UseSafeSubset = true; // 使用安全的子集,如果等於true則無法連接數據庫
this .msc.Language = language.ToString();
((DScriptControlSource_Event) this .msc).Error += new DScriptControlSource_ErrorEventHandler(ScriptEngine_Error);
((DScriptControlSource_Event) this .msc).Timeout += new DScriptControlSource_TimeoutEventHandler(ScriptEngine_Timeout);
}
/// <summary>
/// 運行Eval方法
/// </summary>
/// <param name="expression"> 表達式 </param>
/// <param name="codeBody"> 函數體 </param>
/// <returns> 返回值object </returns>
public object Eval( string expression, string codeBody)
{
msc.AddCode(codeBody);
return msc.Eval(expression);
}
/// <summary>
/// 運行Eval方法
/// </summary>
/// <param name="language"> 腳本語言 </param>
/// <param name="expression"> 表達式 </param>
/// <param name="codeBody"> 函數體 </param>
/// <returns> 返回值object </returns>
public object Eval(ScriptLanguage language, string expression, string codeBody)
{
if ( this .Language != language)
this .Language = language;
return Eval(expression, codeBody);
}
/// <summary>
/// 運行Run方法
/// </summary>
/// <param name="mainFunctionName"> 入口函數名稱 </param>
/// <param name="parameters"> 參數 </param>
/// <param name="codeBody"> 函數體 </param>
/// <returns> 返回值object </returns>
public object Run( string mainFunctionName, object [] parameters, string codeBody)
{
this .msc.AddCode(codeBody);
return msc.Run(mainFunctionName, ref parameters);
}
/// <summary>
/// 運行Run方法
/// </summary>
/// <param name="language"> 腳本語言 </param>
/// <param name="mainFunctionName"> 入口函數名稱 </param>
/// <param name="parameters"> 參數 </param>
/// <param name="codeBody"> 函數體 </param>
/// <returns> 返回值object </returns>
public object Run(ScriptLanguage language, string mainFunctionName, object [] parameters, string codeBody)
{
if ( this .Language != language)
this .Language = language;
return Run(mainFunctionName, parameters, codeBody);
}
/// <summary>
/// 放棄所有已經添加到 ScriptControl 中的 Script 代碼和對象
/// </summary>
public void Reset()
{
this .msc.Reset();
}
/// <summary>
/// 獲取或設置腳本語言
/// </summary>
public ScriptLanguage Language
{
get { return (ScriptLanguage)Enum.Parse( typeof (ScriptLanguage), this .msc.Language, false ); }
set { this .msc.Language = value.ToString(); }
}
/// <summary>
/// 獲取或設置腳本執行時間,單位為毫秒
/// </summary>
/// <summary>
/// 設置是否顯示用戶界面元素
/// </summary>
public bool AllowUI
{
get { return this .msc.AllowUI; }
set { this .msc.AllowUI = value; }
}
/// <summary>
/// 宿主應用程序是否有保密性要求
/// </summary>
public bool UseSafeSubset
{
get { return this .msc.UseSafeSubset; }
set { this .msc.UseSafeSubset = true ; }
}
/// <summary>
/// RunError事件激發
/// </summary>
private void OnError()
{
if (RunError != null )
RunError();
}
/// <summary>
/// OnTimeout事件激發
/// </summary>
private void OnTimeout()
{
if (RunTimeout != null )
RunTimeout();
}
private void ScriptEngine_Error()
{
OnError();
}
private void ScriptEngine_Timeout()
{
OnTimeout();
}
}
}
3.創建一個名為vbs_Record.vbs 的VbScrpt,代碼如下:
msgbox strChId & " , " & strDate & " , " & strStartTime & " , " & strStopTime & " , " & strTimeLen & " , " & strTimeLenS & " , " & strCallType & " , " & strCallResult & " , " & strCallerId & " , " & strDtmf & " , " & strRecordFile & " , " & strSessionId
Set cn = CreateObject( " ADODB.Connection " )
strCn = " provider=SQLOLEDB.1; " & _
" Persist Security Info=False; " & _
" User ID=sa; " & _
" password=*******; " & _
" Initial Catalog=DataBase; " & _
" data source=(local) "
cn.Open strCn
if strCallerId <> "" then
strPhoneNumber = strCallerId
else
strPhoneNumber = strDtmf
end if
str = " insert into cti_Record(SessionId,StartDate,StartTime,StopTime,TimeLen,PhoneNumber,CallType,RecordFile) values(' " + strSessionId + " ',' " + strDate + " ',' " + strStartTime + " ',' " + strStopTime + " ',' " + strTimeLenS + " ',' " + strPhoneNumber + " ',' " + strCallType + " ',' " + strRecordFile + " ') "
cn.Execute str
msgbox " OK "
End function
4.C#調用此VB腳本,代碼如下:
System.IO.StreamReader myReader;
strScriptFile = " d:\\vbs_Record.vbs " ;
strScript = myReader.ReadLine();
while (myReader.EndOfStream == false )
{
strScript = strScript + @"
" + myReader.ReadLine();
}
clsScriptEngine scriptEngine = new clsScriptEngine();
scriptEngine.Language = (ScriptLanguage)Enum.Parse( typeof (ScriptLanguage), " VBScript " );
string [] strParameter = this ._strParameter.Split( ' , ' );
Object[] objParameter = new Object[ 12 ];
objParameter.SetValue(strParameter[ 0 ], 0 );
objParameter.SetValue(strParameter[ 1 ], 1 );
objParameter.SetValue(strParameter[ 2 ], 2 );
objParameter.SetValue(strParameter[ 3 ], 3 );
objParameter.SetValue(strParameter[ 4 ], 4 );
objParameter.SetValue(strParameter[ 5 ], 5 );
objParameter.SetValue(strParameter[ 6 ], 6 );
objParameter.SetValue(strParameter[ 7 ], 7 );
objParameter.SetValue(strParameter[ 8 ], 8 );
objParameter.SetValue(strParameter[ 9 ], 9 );
objParameter.SetValue(strParameter[ 10 ], 10 );
objParameter.SetValue(strParameter[ 11 ], 11 );
scriptEngine.Reset();
scriptEngine.Run( " vbs_Record " , objParameter, strScript);
scriptEngine = null ;
出處:https://www.cnblogs.com/hailexuexi/archive/2011/02/15/1955166.html