C#動態執行JS和VBS腳本

 ========================================================================html

方法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/340163504express

==========================================================================================安全

        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/8263699ide

===================================================================================================================函數

C#利用ScriptControl動態執行JS和VBS腳本

C#中利用ScriptControl動態執行JS和VBS腳本的實現方法,須要的朋友能夠參考下
 
ScriptControl接口

屬性名稱post

類型this

備註spa

AllowUI.net

BOOL

檢測是否容許運行用戶的接口元素。若是爲False,則諸如消息框之類的界面元素不可見。

CodeObject

Object

腳本暴露給宿主調用的對象。只讀。

Modules

Modules

宿主提供給腳本的組件庫模塊。只讀。(COM組件一般都是以對象收集的形式向用戶提供能夠留給用戶二次開發的對象集合,每個收集即一個Modules

Language

String

設置或獲取腳本引擎解釋的語言,例如:VBScriptJScript

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;
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,代碼以下:

複製代碼
Function vbs_Record (strChId,strDate,strStartTime,strStopTime,strTimeLen,strTimeLenS,strCallType,strCallResult,strCallerId,strDtmf,strRecordFile,strSessionId)

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腳本,代碼以下:

複製代碼
string strScript = "" ;
System.IO.StreamReader myReader;
strScriptFile
= " d:\\vbs_Record.vbs " ;
myReader = System.IO.File.OpenText(strScriptFile);

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

相關文章
相關標籤/搜索