【问题标题】:Calling a local function from a dot sourced file从点源文件调用本地函数
【发布时间】:2011-10-27 16:53:47
【问题描述】:

我有一个正在运行的主脚本。它的作用是读取一个充满其他 powershell 脚本的目录,点包含所有脚本并在每个由点分隔文件名的第一部分组成的预定义方法中运行。示例:

  1. 运行master.ps1
  2. Master.ps1 点源 .\resource\sub.ps1
  3. Sub.ps1 定义了一个名为“dosub”的函数
  4. Master.ps1 使用 Invoke-Expression 运行“dosub”

在 sub.ps1 中还定义了函数“saysomething”。在'dosub' 中实现的是对'saysomething' 的调用。

我的问题是我不断收到错误:

“saysomething”一词未被识别为 cmdlet 的名称, 函数、脚本文件或可运行的程序。检查拼写 名称,或者如果包含路径,请验证路径是否正确并 再试一次。

为什么方法'dosub'找不到在同一个文件中定义的方法'saysomething'?

master.ps1:

$handlersDir = "handlers"

$handlers = @(Get-ChildItem $handlersDir)

foreach ( $handler in $handlers ) {

    . .\$handlersDir\$handler

    $fnParts = $handler.Name.split(".")

    $exp = "do" + $fnParts[0]
    Invoke-Expression $exp
}

sub.ps1:

function saysomething() {
    Write-Host "I'm here to say something!"
}


function dosub() {
    saysomething
    Write-Host "In dosub!"
}

【问题讨论】:

  • 你的例子对我有用。您发布的内容正是您正在运行的内容吗?

标签: powershell


【解决方案1】:

您的代码在我的系统上运行。不过你可以稍微简化一下:

$handlersDir = "handlers"

$handlers = @(Get-ChildItem $handlersDir)
foreach ( $handler in $handlers ) 
{
    . .\$handlersDir\$handler

    $exp = "do" + $handler.BaseName
    Write-Host "Calling $exp"
    & $exp
}

注意BaseName 属性的可用性。您也不需要使用Invoke-Expression。您可以通过调用 (&) 运算符调用命名命令。

【讨论】:

  • 嗯,对我来说奇怪的部分是我看到了“在 dosub 中!”的 Write-Host 输出。以及“无法识别'saysomething'一词......”错误。这意味着我的主脚本正在“子”文件中查看、采购和运行代码。这排除了“正常”环境的错误配置,只留下更神秘的可能性。我会在另一台机器上试一试,看看我是否有更好的运气。
  • 我在 PowerShell v2 上进行了测试。你在 v1 上吗?
【解决方案2】:

您所提供的可以根据需要进行。您的机器上可能没有正确的目录等。或者您正在运行其他东西并在此处发布不同的(工作!)代码。

您还可以进行以下更正:

. .\$handlersDir\$handler

你可以这样做:

. $handler.fullname

你可以做的不是分割文件名:

$exp = "do" + $handler.basename

【讨论】:

  • 感谢 basename 指针,我现在将其切换出去。至于代码,我是直接从文件中粘贴出来的,不做任何改动!
  • @QuinnPeters - 它对我有用。确保你有 handlers 目录和其中的文件。您的“环境”可能有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 2020-11-06
  • 2013-01-09
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
相关资源
最近更新 更多