我正在尝试使用System.Management.Automation
使用C#中的参数调用Powershell脚本文件,如下所示:
using (var ps = PowerShell.Create())
{
try
{
var script = System.IO.File.ReadAllText("MyPsFile.ps1");
ps.Commands.AddScript(script);
ps.AddScript(script);
ps.AddParameter("MyKey1", value1);
ps.AddParameter("MyKey2", value2);
var results = ps.Invoke();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
Powershell文件如下所示:
function MyFunction {
Param (
[Parameter(Mandatory=$true)][string] $MyKey1,
[Parameter(Mandatory=$true)][string] $MyKey1,
)
Process {
..do some stuff
}
}
MyFunction $args[0] $args[1]
如果我在Powershell中运行脚本文件,如下所示:
powershell -file MyPsFile.ps1 "Value1" "Value2"
工作正常。但是从C#中调用该文件是行不通的。知道为什么吗?
所以我已经像这样更新了代码
var runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
var runSpaceInvoker = new RunspaceInvoke(runspace);
runSpaceInvoker.Invoke("Set-ExecutionPolicy Unrestricted");
// create a pipeline and feed it the script text
var pipeline = runspace.CreatePipeline();
var command = new Command(@". .\MyScript.ps1");
command.Parameters.Add("MyParam1", value1);
command.Parameters.Add("MyParam2", value2);
pipeline.Commands.Add(command);
pipeline.Invoke();
runspace.Close();
但我收到错误Powershell ps1文件“无法识别为cmdlet,函数,可操作程序或脚本文件。”
我发现了Powershell ps1 file "is not recognized as a cmdlet, function, operable program, or script file."
但它没有解决问题。知道还有什么可能导致这个错误吗?
答案 0 :(得分:0)
最后我找到了解决方案。两件事情: 此代码解决了“未被识别为cmdlet,函数,可操作程序或脚本文件错误。感谢Problem with calling a powershell function from c#
using (var runspace = RunspaceFactory.CreateRunspace())
{
try
{
var script = File.ReadAllText("MyScript.ps1");
runspace.Open();
var ps = PowerShell.Create();
ps.Runspace = runspace;
ps.AddScript(script);
ps.Invoke();
ps.AddCommand("MyFunction").AddParameters(new Dictionary<string, string>
{
{ "Param1" , value1},
{ "Param2", value2},
{ "Param3", value3},
});
foreach (var result in ps.Invoke())
{
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
重要的是,我还必须从脚本文件中删除进程包装器属性
****MyScripts.ps1
function MyFunction
{
Param (
[Parameter(Mandatory=$true)][string] myParam1,
[Parameter(Mandatory=$true)][string] myParam2,
[Parameter(Mandatory=$true)][string] myParam3,
)
// Removing the Process wrapper solved the problem, the code didn't run with it
Process {
//DOSTUFF
}
}