【问题标题】:Powershell - How to call cmdlet in non-interactive way in Powershell script?Powershell - 如何在 Powershell 脚本中以非交互方式调用 cmdlet?
【发布时间】:2022-01-06 10:58:32
【问题描述】:

在我的 powershell 脚本中,我调用了一个 cmdlet(比如“连接数据库”)。如果 cmdlet 需要其他参数,它会提示用户提供这些值(例如,“Connect-Database”无法从注册表获取凭据,因此它会在 Powershell 控制台上提示输入“用户名”“密码”并希望用户提供值)。

我查看了 Powershell cmdlet 的代码。我发现它使用“CommandInvocationIntrinsics”来提示用户(使用“NewScriptBlock”,然后使用“CommandInvocationIntrinsics”的“Invoke”方法)。

由于我是从 Powershell 脚本调用此 cmdlet,因此我希望每当出现此类提示时,它都会被抑制并引发异常。

代码是这样的 -

try
{
    $db = Connect-Database <databasename>
    #if username / password is prompted, it should be converted into error. But it should not be shown in powershell console.

    if($Error.Count > 0)
    {
        throw $Error[0]
    }
}
catch
{
    #do something
}

【问题讨论】:

    标签: powershell


    【解决方案1】:

    我这样做的方法是首先枚举强制参数,然后使用 $null 变量对其进行初始化。所以没有更多的交互并抛出错误。

    【讨论】:

      【解决方案2】:

      简单的解决方法,不要提示。我觉得您应该总是提示(通过使用强制参数),或者在执行命令期间从不提示。如果您没有足够的信息,则抛出错误。如果您的命令以交互方式使用,用户可以使用正确的信息重新运行。

      【讨论】:

        【解决方案3】:

        这是 PowerShell 设计的一部分,可能无法克服。

        如果您尝试使用非交互式,则应确保在尝试调用 cmdlet 之前收集了所有必要信息(也就是说,您的非交互式调用不应缺少参数)。您可能正在遵循反模式,应该重新考虑您的方法。在您的非交互式脚本开始时提示(又名,短暂的启动交互),为您的非交互式脚本提供参数(如果设置为强制时,这些参数反过来会提示),或从配置文件中读取(和首先验证信息)是几种方法。您会注意到的共同点是它们都涉及快速失败/早期失败,这是一个非常好的设计。

        【讨论】:

          猜你喜欢
          • 2014-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 2019-08-16
          • 1970-01-01
          • 2015-11-18
          相关资源
          最近更新 更多