gpt4 book ai didi

powershell - PowerShell 模块中 Get-Command 的范围

转载 作者:行者123 更新时间:2023-12-02 23:45:39 25 4
gpt4 key购买 nike

总结

我想测试一个函数是否存在。我写了一个函数来为我做这件事,但是当我把它放在模块中时,它在模块的范围内运行,而我想要的是它在调用它的 session 范围内运行。

描述:

如果您将其复制并粘贴到 PowerShell 提示符中,它会按预期工作。

function Test-Function($functionName) {
$values = @(get-command -all | where {$_.Name -eq "$functionName" -and $_.CommandType -eq "Function"})
return $values.Count -gt 0
}

此时,您可以运行 test-function Get-ChildItem($false,因为那是一个 cmdlet)或 test-function测试函数($true,因为那是一个函数)。

但是,如果您要经常使用此功能怎么办?

从模块调用 Get-Command

如果您将其保存在 .psm1 文件中并添加对 Export-ModuleMember 的调用以公开该函数,它会起作用……有时。

import Test.psm1

Test-Function Test-Function
# Returns $true

function blah() { echo "whatever" }

Test-Function blah
# Returns $false

据我所知,这是一个作用域问题——模块有自己的作用域,它看不到我在它之外创建的其他函数。

解决方法

基本上,我想保存这个函数供以后使用,并在多个脚本文件中使用它——对我来说,它听起来像是一个候选模块。但是,除非有一个聪明的解决方案来解决这个范围问题,否则我会遇到一些糟糕的解决方法:

  1. 不要将其放入模块中,将其放入 .ps1 文件中并点源。

    这就是我们现在所做的,它确实有效,如果没有其他解决方法,这可能是最不丑陋的事情。

  2. 根本不要把它放在模块中,并强制任何想使用它的人重新实现

    我猜只有几行,所以这行得通。问题是它已经在我们的部署脚本中的几个地方了,如果我能把它变成一个函数就好了……

  3. 使用范围界定或脚本 block 之类的东西做一些奇怪的事情。

    比如,将其放入模块中:

    $testFuncBlock = {
    param($functionName)
    $values = @(get-command -all | where {$_.Name -eq "$functionName" -and $_.CommandType -eq "Function"})
    return $values.Count -gt 0
    }
    Export-ModuleMember -variable testFuncBlock

    并通过脚本 block 的点源来调用它:

    . $testFuncBlock Function-Name

    显然这很丑

有没有更好的解决方案?

这就是我的全部想法。有什么东西可以让我将它保存在模块中并稍后在没有脚本 block 的情况下引用它吗?

最佳答案

Get-Command 具有不同的行为,具体取决于 PowerShell 的版本。查看参数文档中的版本特定说明。

Using the Get-Command Cmdlet

相反,我建议使用 function: drive:

function Test-Function ($Name) {
Test-Path -Path "function:${Name}"
}

关于powershell - PowerShell 模块中 Get-Command 的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620677/

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