Invoke-MyFunction是我编写的一个命令行,它接受输入文件,更改它,并在指定位置创建一个新的输出文件。如果我在桌面上打开PowerShell,请导入MyCommandlet.ps1,然后运行
Invoke-MyFunction -InputPath path\to\input -OutputPath path\to\output
一切都按预期工作。但是当我尝试使用下面的代码从C#程序导入和调用命令时,命令行开关不运行,不记录输出,也不会产生输出文件。它不会抛出CommandNotFoundException,所以我假设PowerShell对象识别我的命令行开关。但我无法弄清楚它为什么不执行它。
//set up the PowerShell object
InitialSessionState initial = InitialSessionState.CreateDefault();
initial.ImportPSModule(new string[] { @"C:\path\to\MyCommandlet.ps1" });
Runspace runspace = RunspaceFactory.CreateRunspace(initial);
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
//have MyFunction take input and create output
ps.AddCommand("Invoke-MyFunction");
ps.AddParameter("OutputPath", @"C:\path\to\output");
ps.AddParameter("InputPath", @"C:\path\to\input");
Collection<PSObject> output = ps.Invoke();
此外,在调用MyFunction之后,PowerShell对象ps无法执行任何其他命令。甚至是已知的。
答案 0 :(得分:2)
这对我有用:
//set up the PowerShell object
var initial = InitialSessionState.CreateDefault();
initial.ImportPSModule(new string[] { @"C:\Users\Keith\MyModule.ps1" });
Runspace runspace = RunspaceFactory.CreateRunspace(initial);
runspace.Open();
PowerShell ps = PowerShell.Create();
ps.Runspace = runspace;
//have MyFunction take input and create output
ps.AddCommand("Invoke-MyFunction");
ps.AddParameter("OutputPath", @"C:\path\to\output");
ps.AddParameter("InputPath", @"C:\path\to\input");
var output = ps.Invoke();
foreach (var item in output)
{
Console.WriteLine(item);
}
使用MyModule.ps1:
function Invoke-MyFunction($InputPath, $OutputPath) {
"InputPath is '$InputPath', OutputPath is '$OutputPath'"
}
导致我失败的一件事是在Visual Studio 2013上(也许是2012年)AnyCPU应用程序实际上将在64位操作系统上运行32位。您必须为PowerShell x86设置执行策略以允许脚本执行。尝试以管理员模式打开PowerShell x86 shell并运行Get-ExecutionPolicy
。如果设置为Restricted
,请使用Set-ExecutionPolicy RemoteSigned
允许脚本执行。