gpt4 book ai didi

powershell - powershell 模块有没有办法进入其调用者的范围?

转载 作者:行者123 更新时间:2023-12-04 00:53:54 24 4
gpt4 key购买 nike

我有一组实用程序函数和其他代码,我将它们点源到我编写的每个 powershell 文件中。在受到影响它的调用者范围变量的影响后,我开始考虑将其更改为 powershell 模块。

我遇到了一些我在其中做的特殊事情的问题,我实际上确实希望在作用域之间进行一些交互。我想知道是否有无论如何“进入”模块调用者的范围以在移动到 powershell 模块时保留此功能?

如果不是,那么将这些更专业的东西保存在点源文件中并将更传统的实用程序功能移动到模块中是我最好的前进路径吗?以下是不容易移动到模块的内容:

  • 设置严格模式和错误操作首选项以保持理智,例如:
    Set-StrictMode -Version Latest
    $ErrorActionPreference = "Stop"
    $PSDefaultParameterValues['*:ErrorAction']='Stop'

    当代码从 .psm1 powershell 模块运行时,这(如预期的那样)对调用者的环境没有影响。有没有办法从 psm1 范围跨越到调用者范围来进行这些更改?
  • 打印有关顶级脚本调用的信息,例如:
    $immediateCallerPath = Get-Variable -scope 1 -name PSCommandPath -ValueOnly
    Write-Host "Starting script at $immediateCallerPath"
    $boundParameters = Get-Variable -scope 1 -name PSBoundParameters -ValueOnly
    Write-Host "Bound parameters are:"
    foreach($psbp in $boundParameters.GetEnumerator())
    {
    "({0},{1})" -f $psbp.Key,$psbp.Value | Write-Host
    }

    同样,这些命令一旦放置在 .psm1 文件中就无法再看到最顶层的调用范围
  • 最佳答案

    $PSCmdlet.SessionState似乎在脚本模块内部提供了一个函数来访问调用站点的变量,前提是调用站点位于模块外部。 (如果调用站点在模块内,您可以使用 Get-Set-Variable -Scope 。)这是一个使用 SessionState 的示例:

    New-Module {
    function Get-CallerVariable {
    param([Parameter(Position=1)][string]$Name)
    $PSCmdlet.SessionState.PSVariable.GetValue($Name)
    }
    function Set-CallerVariable {
    param(
    [Parameter(ValueFromPipeline)][string]$Value,
    [Parameter(Position=1)]$Name
    )
    process { $PSCmdlet.SessionState.PSVariable.Set($Name,$Value)}
    }
    } | Import-Module

    $l = 'original value'
    Get-CallerVariable l
    'new value' | Set-CallerVariable l
    $l

    哪个输出
    original value
    new value

    我不确定 SessionState旨在以这种方式使用。值得一提的是,这与 Get-CallerPreference.ps1 中使用的技术相同。 .还有一些测试用例 here它传递 PowerShell 版本 2 到 5.1。

    关于powershell - powershell 模块有没有办法进入其调用者的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46528262/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com