PowerShell命令行开关被调用但没有响应

时间:2014-07-10 20:12:21

标签: c# visual-studio powershell cmdlets

Invoke-MyFunction是我编写的一个命令行,它接受输入文件,更改它,并在指定位置创建一个新的输出文件。如果我在桌面上打开PowerShell,请导入MyCommandlet.ps1,然后运行

Invoke-MyFunction -InputPath path\to\input -OutputPath path\to\output

一切都按预期工作。但是当我尝试使用下面的代码从C#程序导入和调用命令时,命令行开关不运行,不记录输出,也不会产生输出文件。它不会抛出CommandNotFoundException,所以我假设P​​owerShell对象识别我的命令行开关。但我无法弄清楚它为什么不执行它。

    //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无法执行任何其他命令。甚至是已知的。

1 个答案:

答案 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允许脚本执行。