【问题标题】:Powershell passing switch parameter to selfPowershell将开关参数传递给自己
【发布时间】:2012-10-23 06:57:15
【问题描述】:

我有这个调用自身的 powershell 脚本(因为脚本的第 1 阶段是在 GAC 中加载程序集,所以我需要刷新 AppDomain)。如何将开关参数传递给 self.目前我正在这样做:

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

【问题讨论】:

    标签: powershell


    【解决方案1】:

    可能根本不需要调用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的调用及其问题。

    【讨论】:

    • 所以使用 & 运算符也刷新了应用程序域? ti只是捷径还是有区别?
    • & 不是powershell 的快捷方式。如果它是脚本或函数,则它是一个运算符“调用命令”,在新范围内(与 . 运算符 == 在同一范围内调用相反)。在某些情况下可以省略它,但在您的情况下则不能,因为命令本身是评估表达式的结果。至于“也刷新应用程序域”,我不知道你的 Deploy.ps1 是做什么的。实际上,也许您仍然必须通过 powershell 使用调用,这意味着启动一个单独的 powershell 进程。这就是为什么我以“大概”这个词开始我的回答,我不确定。
    • 我正在将程序集部署到 GAC,我可能在脚本的第 2 步中引用这些程序集,因此我需要一个新的 powershell 进程来刷新应用程序域。感谢您的回答,这很有意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2019-02-09
    • 2022-01-05
    • 1970-01-01
    • 2016-10-26
    • 2023-03-26
    相关资源
    最近更新 更多