从点源文件调用本地函数

时间:2011-10-27 16:53:48

标签: powershell

我有一个正在运行的主脚本。它的作用是通过一个填充了其他PowerShell脚本的目录读取,dot包含所有这些脚本并运行预定义的方法,每个方法由点分隔文件名的第一部分组成。例如:

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

    在sub.ps1中也定义了函数'sayomething'。实现in'dosub'是对'sayomething'的调用。

    我的问题是我一直收到错误:

      

    术语“sayomething”未被识别为cmdlet的名称,   功能,脚本文件或可操作程序。检查拼写   名称,或者如果包含路径,请验证路径是否正确   再试一次。

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

    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!"
    }
    

2 个答案:

答案 0 :(得分:0)

您的代码适用于我的系统。但是你可以稍微简化一下:

$handlersDir = "handlers"

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

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

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

答案 1 :(得分:0)

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

您还可以进行以下更正:

. .\$handlersDir\$handler

而不是上面你可以这样做:

. $handler.fullname

而是可以分割文件名:

$exp = "do" + $handler.basename