在工作项目中,我有一个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;
}
为什么这有必要?我错过了一些重要的细节吗?
答案 0 :(得分:0)
答案是“脚本文件名是命令而不是脚本。所以,你应该用AddCommand添加它而不是AddScript。”来自PetSerAl的评论。