从 C# 应用程序的脚本中调用 PowerShell 函数

Posted

技术标签:

【中文标题】从 C# 应用程序的脚本中调用 PowerShell 函数【英文标题】:Calling PowerShell function from within the script in C# Application 【发布时间】:2013-07-30 00:01:48 【问题描述】:

我两天前刚开始玩 PowerShell。我正在从 C# 控制台应用程序运行 PowerShell 脚本。我将对象列表 (MyObj1) 作为参数传递给脚本,并对对象进行一些数据操作。但是,当我在脚本中调用函数时,在打印出错误时会出现函数无法识别的错误。这是我正在做的一个小例子。

public class MyObj1

    public string Property1 get; set;
    public int Property2 get; set;

这是我用来运行脚本的部分代码:

var rs = RunspaceFactory.CreateRunspace();
rs.Open();
rs.SessionStateProxy.SetVariable("list", myObjectList);
rs.SessionStateProxy.SetVariable("xml", xml);
var ps = PowerShell.Create();
ps.Runspace = rs;
var psScript = System.IO.File.ReadAllText(@"C:\temp\ps.ps1");
ps.AddScript(psScript);
ps.Invoke();
foreach (var item in myObjectList)

    Console.WriteLine(item.Property1 + "; " + item.Property1);


Console.WriteLine("\n================================ ERRORS ============================ \n");

foreach (ErrorRecord err in ps.Streams.Error)

    Console.WriteLine(err.ToString());

这是实际的脚本:

$list | ForEach 
    $_.Property1 = $_.GetType()
    DoSomeThing ([ref] $_)


Function DoSomeThing ($MyObject)

    $Asset.Property2 = $Asset.Property2 + $Asset.Property2

两天前,当我使用上面的一些虚拟类玩相同的脚本时,我能够修改数据,但从今天早上开始,我已经修改了脚本以使用真实类。而 Ctrl+Z 只会带我回到编辑器中的某个点。在ForEach 循环中,一切正常,直到我调用该函数。

对于该项目,计划是在 C# 中使用所需的数据操作推送此应用程序,然后在脚本中进行一些可选的更改。关键是避免将应用程序推送到生产服务器并在脚本中处理所有/大多数数据操作。

【问题讨论】:

【参考方案1】:

将函数声明移到脚本文件的开头。

Function DoSomeThing ($MyObject)

    $Asset.Property2 = $Asset.Property2 + $Asset.Property2


$list | ForEach 
    $_.Property1 = $_.GetType()
    DoSomeThing ([ref] $_)

PS 不编译脚本,它逐个命令地执行它。所以你必须在使用它之前创建/声明函数。

【讨论】:

有道理。将在上午尝试。如果我能再次拿出我的旧样本,我会在这里发布,但我仍然在 $list 循环之后声明了函数。

以上是关于从 C# 应用程序的脚本中调用 PowerShell 函数的主要内容,如果未能解决你的问题,请参考以下文章

从 C# Windows 窗体内部调用的 Bash 脚本

如果从 C# 控制台应用程序调用,则调用的 Arcpy 脚本不会完成

如何从 C# 中的 Python 脚本调用特定方法?

如何从 C# 程序执行 ghostscript

从 PowerShell 调用时无法在 dll 中转换透明代理,但在 C# 控制台应用程序中成功

无法从 C# 调用 Powershell 函数