我有一个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后,我发现打印了你好!所以错误不是关于调用脚本而是关于脚本本身。抱歉混淆,谢谢大家!
答案 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