2

我有一个powershell脚本,比如:function2.ps1:

function try2
{
    return "Hello"
}

然后在c#中,我有:

RunspaceConfiguration rsc = RunspaceConfiguration.Create();
Runspace rs = RunspaceFactory.CreateRunspace(rsc);
rs.Open();

RunspaceInvoke si = new RunspaceInvoke(rs);
PowerShell ps = PowerShell.Create();

ps.Commands.AddScript(". .\\function2.ps1");
ps.Invoke();

ps.AddCommand("try2");
ps.Invoke();

它发出 System.Managment.Automation.CommandNotFoundException 说 try2 不被识别为 cmdlet、函数、脚本文件的名称,等等等等。

这真的很棘手,我错过了什么?:)

更新:

function.ps1 位于:c:\function.ps1。

目前的做法是:

ps.Commands.AddScript(@"cd C:\; . .\function.ps1;try2");
ps.Invoke();

但仍然失败,甚至更有趣:

ps.Commands.AddScript(@"cd C:\; . .\function222222222222222222.ps1;try2");
ps.Invoke();

虽然我 100% 确定 function22222222222222222222.ps1 不存在但不会给出错误。确定提供文件路径有问题...

[更新]

原来是因为powershell文件中引用程序集的一些运行时错误:这个程序集是由比当前加载的运行时更新的运行时构建的,无法加载。

把目标框架从4.0改成3.5后,发现打印了hello!所以错误不是关于调用脚本,而是关于脚本本身。很抱歉造成混乱,谢谢大家!

4

2 回答 2

2

我认为您需要指定function2.ps1. ".\function2.ps1" 只会在当前目录中查找脚本,即 C# 进程的初始工作目录设置为什么,除非您在 C# 代码中的某处更改了它。您也可以在脚本中更改它,例如:

ps.Commands.AddScript(@"cd <path>; . .\function2.ps1; try2"); 
于 2013-01-24T21:23:21.063 回答
0

从 C# 运行 .ps1 脚本的一种方法(非常接近您的方法)可以在以下位置找到:

http://www.codeproject.com/Articles/18229/How-to-run-PowerShell-scripts-from-C

为了运行脚本,您似乎缺少一些管道命令。

例如:

Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(scriptText);

pipeline.Commands.Add("Out-String");

// execute the script

Collection<psobject /> results = pipeline.Invoke();

如果您找不到 System.Management.Automation dll,那么您可能需要下载更新版本的Windows SDK,如果没有,您可以在以下位置找到它:C:\Program Files (x86)\Reference Assemblies \Microsoft\WindowsPowerShell\v1.0\

来自:在 Visual Studio 中引用 system.management.automation.dll

于 2013-01-24T21:40:09.477 回答