为什么PSCommand似乎忽略对AddParameter的调用?

时间:2016-04-04 23:14:46

标签: c# powershell parameters

在工作项目中,我有一个Web控制器将用户标识和布尔标志传递给PSCommand的包装器,因为要执行的Powershell脚本需要参数。从Web控制器向我的包装器传递值,执行Powershell脚本以及传回结果值似乎都能正常运行。我的反对意见是将参数传递给PSCommand的功能。

在下面的代码中,我将脚本和参数添加到PSCommand的实例,然后将其分配给PowerShell实例的Commands属性。我是使用这种技术还是使用AddCommand方法似乎无关紧要。

这是我最初编写的代码,它使用了添加参数的方法,但没有将值正确地传递给正在执行的PowerShell脚本:

private static PowerShell CreateScriptWithParams(string scriptPath, string userId, bool prod)
    {
        var cmd = new PSCommand();
        cmd.AddScript(scriptPath);
        cmd.AddParameter("Prod", prod);
        cmd.AddParameter("DeployMode", true);
        cmd.AddParameter("DeployUser", userId);

        var ps = PowerShell.Create();
        ps.Commands = cmd;

        return ps;
    }

默认情况下,boolean标志初始化为false值,用户id只是一个空字符串。使用上述方法,这些值永远不会改变。这些参数似乎永远不会被“接收”,也不会出现在$ args或$ PSBoundParameters中。

以下是代码,在我看来,它只是简单地欺骗AddScript来为我做AddParameter方法应该做的工作。我可以猜测它在命令主机中执行“powershell.exe scriptname -arg arg -arg2”的方式类似,但我不确定实现细节。

private static PowerShell CreateScriptInlineParams(string scriptPath, string userId, bool prod)
    {
        var argString = scriptPath;

        if (prod)
            argString += " -Prod";

        var cmd = new PSCommand();
        cmd.AddScript(string.Format("{0} -DeployMode -DeployUser {1}", argString, userId));

        var ps = PowerShell.Create();
        ps.Commands = cmd;

        return ps;
    }

为什么这有必要?我错过了一些重要的细节吗?

1 个答案:

答案 0 :(得分:0)

答案是“脚本文件名是命令而不是脚本。所以,你应该用AddCommand添加它而不是AddScript。”来自PetSerAl的评论。