【问题标题】:Make Start-Process respect Verbose preference of parent script使 Start-Process 尊重父脚本的详细首选项
【发布时间】:2021-08-07 18:41:46
【问题描述】:

这是我的脚本

Parent.ps1

[CmdletBinding(SupportsShouldProcess=$true)]
Param()
Write-Verbose 'Triggering Child Process...'
Start-Process PowerShell.exe '.\Child.ps1'

Child.ps1

[CmdletBinding(SupportsShouldProcess=$true)]
Param()
Write-Verbose 'Child Process Triggered.'    # I want output from this line to be displayed
Write-Output 'Child Process Triggered.'
Start-Sleep 10

我正在调用父脚本如下

powershell Parent.ps1 -Verbose

实际输出:

VERBOSE: Triggering Child Process...
Child Process Triggered.

期望的输出:

VERBOSE: Triggering Child Process...
VERBOSE: Child Process Triggered.
Child Process Triggered.

【问题讨论】:

    标签: powershell


    【解决方案1】:

    如果你真的想通过另一个 PowerShell 实例在新窗口中异步运行 .\Child.ps1

    Start-Process PowerShell.exe "-c .\Child.ps1 -Verbose:`$$($VerbosePreference -eq 'Continue')"
    

    注意使用-c (-Command) 来表示命令字符串传递给的PowerShell CLI 参数,以将其与-f (-File) 区分开来。虽然不是绝对必要的,因为-c 是 Windows PowerShell (powershell.exe) 中的默认值,它有助于澄清,特别是考虑到 PowerShell (Core) 7+ (pwsh) 现在默认为-f.

    • 当您使用 -Verbose (-vb) 调用 Parent.ps1 脚本时,PowerShell 将此开关转换为值为 Continue 的脚本范围的 $VerbosePreference 变量。

    • 要以编程方式传播开关值(开或关),您可以在开关名称后面加上 :布尔值,例如-Verbose:$true.

      • 警告:虽然像-Verbose:$false 这样的东西通常根本不通过开关相同,但也有例外,这是其中之一他们:-Verbose:$false 明确覆盖 调用者的 $VerbosePreference 首选项变量以停用详细输出 - 请参阅 this answer
      • 也就是说,在您的情况下这不是问题,因为您正在启动一个新的 PowerShell 实例,并且没有会话内部调用者。
    • 上面使用expandable string$VerbosePreference 的值转换为适当的布尔值;请注意,子表达式 ($(...)) 以 `$ 为前缀,即 转义 $ 字符被保留逐字,因为字符串化 布尔值导致TrueFalse,因此需要$ 前缀才能将其转回布尔值,就像它需要在源代码中表示为文字

    请注意,如果您要从父脚本中直接调用.\Child.ps1 ,它将自动“继承”父脚本的$VerbosePreference 值(默认情况下它会看到相同的值,因为PowerShell 的动态作用域)。


    关于 -c (-Command) 与 -f (-File) 和 PowerShell(核心)7+ 的说明:

    对于通过 CLI 调用 PowerShell 脚本文件 (.ps1),通常使用-f (-File) 参数就足够且更可取地稳健传递逐字参数; -c (-Command) 仅在您需要将命令字符串评估为作为 PowerShell 代码时才需要。

    不幸的是,在 Windows PowerShell (powershell.exe) 中,-f 参数无法识别布尔参数值,这就是上述解决方案中使用 -c 的原因。此限制已在 PowerShell (Core) 7+ (pwsh.exe) 中得到修复。

    另见:

    【讨论】:

      猜你喜欢
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 2014-11-17
      • 2019-08-16
      • 2021-03-02
      • 2012-12-22
      相关资源
      最近更新 更多