【问题标题】:How to scope a function to a certain module?如何将功能范围限定到某个模块?
【发布时间】:2022-06-15 01:20:06
【问题描述】:

我有main.ps1module.psm1module.psm1 是一个类模块和一个函数。函数是Read-Host。在module.psm1 的实例中调用时,我必须重写它以返回'y'

现在,在main.ps1 中,我想使用Read-Host 的默认行为(提示用户)。有没有办法做到这一点?还是一种将Read-Host 覆盖功能仅限于该模块范围的方法?

谢谢。

【问题讨论】:

  • I had to override it to return 'y' ... 有点XY 的味道。在“解决方案”是覆盖常见的内置 cmdlet 的情况下,您实际上在做什么?
  • 尝试在该特定模块中自动执行需要用户提供“y”的脚本。

标签: powershell


【解决方案1】:

正如评论者所说,不建议这样做。应该通过添加一个可选参数来重构模块函数,该参数允许调用者以编程方式提供选择。

如果你真的不能修改模块的源,那么这将是一种暂时覆盖Read-Host的方法:

module.psm1

Function ModuleFun {
    $read = Read-Host -Prompt 'Enter (Y)es or (N)o' 
    "You entered: $read"
}

ma​​in.ps1

Import-Module $PSScriptRoot\module.psm1

# Temporary override of Read-Host command
Function Read-Host { 'y' }

try {
    # ModuleFun calls our Read-Host override
    ModuleFun
}
finally {
    # Remove our Read-Host override again
    Remove-Item Function:Read-Host
}

Read-Host 'Enter something'

像往常一样处理这些临时的东西,最好将它们包装在 try/finally 块中,以确保即使在出现异常的情况下也能运行清理。

覆盖有效,因为函数的优先级高于同一会话中定义的 cmdlet。来自docs

如果不指定路径,PowerShell 使用以下优先级 为当前加载的所有项目运行命令时的顺序 会话:

别名函数 Cmdlet 外部可执行文件(程序和 非 PowerShell 脚本)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2018-10-23
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2019-07-03
    相关资源
    最近更新 更多