【问题标题】:Is there a way to access the functions from the calling module scope in PowerShell?有没有办法从 PowerShell 中的调用模块范围访问函数?
【发布时间】:2015-12-10 23:50:35
【问题描述】:

我有两个.ps1 文件。一个叫另一个。我想将一个函数名传递给另一个,以便另一个可以调用一个文件中定义的函数(依赖注入)。似乎是在调用另一个 .ps1 文件时,它虽然没有从调用者模块范围内查看函数。

这样做的原因是我可以生成一些包含这些函数的 powershell 实例。但是,由于这些是单独的实例,它们将无法访问调用者代码,因此我需要通过说明我希望导出哪些函数并将这些函数转换为脚本字符串来重新生成函数并将它们提供给新进程像这样:

Param(
   [string]$Command,
   [Array]$IncludeFunction = @()
)
Begin{
  $Command += "`r`n"
  Foreach ($functionName in $IncludeFunction)
  {
      $Command += "function $functionName() { ${function:$functionName} }`r`n"
  }
}

我注意到可以访问调用模块范围的变量,所以我想知道函数是否也可以这样做。

【问题讨论】:

  • 简单地点源其他文件有什么问题吗? . 'C:\path\to\other.ps1'
  • 是的,刚刚发现,但事实证明它是不需要的。似乎${function:$functionName} 不起作用。我必须改用(get-command $functionName).Definition。 o.O

标签: powershell


【解决方案1】:

在脚本中包含函数的快速而肮脏的方法是将函数写入第二个脚本,然后将dot-source 写入要使用函数的脚本中:

# script1.ps1

. 'C:\path\to\script2.ps1'

SomeFunctionFromScript2 -Foo 'bar'

如果您想为多个脚本提供函数库,最好将这些函数包装成script module

# library.psm1

function FunctionA {
  ...
}

function FunctionB {
  ...
}

Export-ModuleMember -Function *

然后你可以分发这个库,人们可以像任何其他模块一样导入它:

# script1.ps1

Import-Module library

FunctionA ...

【讨论】:

  • 管道到.ps1 文件时是否隐含点源?
  • @Adrian 不。那完全不同。
【解决方案2】:

问题不在于它们不可用,而是因为${function:$functionName} 不起作用。我必须改用(get-command $functionName).Definition。不知道为什么会这样。

【讨论】:

    猜你喜欢
    • 2018-03-13
    • 2011-02-09
    • 1970-01-01
    • 2023-04-01
    • 2017-08-26
    • 2021-04-03
    • 1970-01-01
    • 2011-07-14
    • 2018-06-08
    相关资源
    最近更新 更多