使用Powershell将开关参数传递给自身

4

我有一个PowerShell脚本,它会调用自己(因为脚本的第一阶段是加载GAC中的程序集,所以需要刷新AppDomain)。我该如何将开关参数传递给自己?目前我的做法是:

if ($provisionsites -eq $true)
{
    powershell $currentDirectory/Deploy.ps1 -reload:$true -env:$env -provisionsites
}
else
{
    powershell $currentDirectory/Deploy.ps1 -reload:$true -env:$env
}

对我来说,这似乎太啰嗦了。如果我尝试这样做:

powershell $currentDirectory/Deploy.ps1 -reload:$true -env:$env -provisionsites:$provisionsites

它失败了,并显示:

无法将值“System.String”转换为类型“System.Management.Automation.SwitchParameter”

1个回答

3

可能根本不需要调用powershell.exe。用运算符&替换它,即在同一个会话中调用脚本,避免参数转换和相关问题。这些问题是可以解决的,但最好首先避免。也就是说,请执行以下操作:

& $currentDirectory/Deploy.ps1 -reload:$true -env:$env -provisionsites:$provisionsites

关于这个问题,$provisionsites在传递给外部应用程序之前被转换为字符串(TrueFalse, 而不是 $true$false)。因此,实际参数的结果看起来像 -provisionsites:True。然后在一个新的powershell会话中,它将这样的参数传递给脚本Deploy.ps1。它失败了,因为不希望出现字符串TrueFalse,而是希望出现布尔值。
一种可能的解决方法是添加转义字符$
powershell $currentDirectory/Deploy.ps1 ... -provisionsites:`$$provisionsites

但要考虑删除对 powershell 的调用和相关问题。


使用&运算符刷新应用程序域,这只是一个快捷方式还是有区别呢? - Luis
& 不是 powershell 的快捷方式。它是一个操作符 "调用命令",如果它是脚本或函数,则在新作用域中(与.运算符相反,在同一作用域中调用)。在某些情况下,它可以省略,但在您的情况下不能省略,因为命令本身是已评估表达式的结果。至于 "刷新应用程序域",我不知道您的 Deploy.ps1 做了什么。实际上,也许您仍然必须通过 powershell 调用,这意味着启动一个单独的 powershell 进程。这就是为什么我在回答开始时使用了“可能”这个词,我不确定。 - Roman Kuzmin
我正在将程序集部署到全局程序集缓存(GAC),这些程序集可能会在脚本的第二步中被引用,因此我需要一个新的PowerShell进程来刷新应用程序域。谢谢您的答案,这很有道理。 - Luis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接