在c#中使用powershell脚本进行dot-sourcing不起作用

时间:2013-01-24 20:54:13

标签: c# powershell

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

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%确定功能22222222222222222222.ps1不存在但不会给出错误。确定给出文件路径有问题......

[UPDATE]

事实证明,这是因为powershell文件中的引用程序集中存在一些运行时错误:此程序集由比当前加载的运行时更新的运行时构建,无法加载。

将目标框架从4.0更改为3.5后,我发现打印了你好!所以错误不是关于调用脚本而是关于脚本本身。抱歉混淆,谢谢大家!

2 个答案:

答案 0 :(得分:3)

我认为您需要指定function2.ps1的完整路径。 “。\ function2.ps1”将只查找当前目录中的脚本,这是C#进程的初始工作目录设置的任何内容,除非您在C#代码中的某处更改了它。您也可以在脚本中更改它,例如:

ps.Commands.AddScript(@"cd <path>; . .\function2.ps1; try2"); 

答案 1 :(得分:0)

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

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

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

例如:

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 \

来自:Referencing system.management.automation.dll in Visual Studio