从C#执行powershell命令

时间:2014-04-30 01:50:35

标签: c# powershell

我尝试从C#

执行此powershell命令
gci C:\Ditectory -Recurse | unblock-file -whatif

使用此代码

        Runspace space = RunspaceFactory.CreateRunspace();
        space.Open();
        space.SessionStateProxy.Path.SetLocation(directoryPath);
        Pipeline pipeline = space.CreatePipeline();
        pipeline.Commands.Add("get-childitem");

        pipeline.Commands.Add("Unblock-File");
        pipeline.Commands.Add("-whatif");
        var cresult = pipeline.Invoke();
        space.Close();

我不断得到关于whatif not be recognized命令的例外。 我可以使用C#中的whatif

2 个答案:

答案 0 :(得分:3)

WhatIf是一个参数而不是命令,因此应将其添加到Unblock-File的命令对象的Parameters集合中。但是,API从Commands.Add返回void,这使得它变得尴尬。我建议使用一小组辅助扩展方法,这些方法允许您使用类似构建器的语法:

internal static class CommandExtensions
{
    public static Command AddCommand(this Pipeline pipeline, string command)
    {
        var com = new Command(command);
        pipeline.Commands.Add(com);
        return com;
    }

    public static Command AddParameter(this Command command, string parameter)
    {
        command.Parameters.Add(new CommandParameter(parameter));
        return command;
    }

    public static Command AddParameter(this Command command, string parameter, object value)
    {
        command.Parameters.Add(new CommandParameter(parameter, value));
        return command;
    }
}

然后你的代码很简单:

pipeline.AddCommand("Get-ChildItem").AddParameter("Recurse");
pipeline.AddCommand("Unblock-File").AddParameter("WhatIf");
var results = pipeline.Invoke();
space.Close();

答案 1 :(得分:1)

Whatif是一个参数,而不是命令。请改用AddParameter方法:

http://msdn.microsoft.com/en-us/library/dd182433(v=vs.85).aspx