簡體   English   中英

從點源文件中調用本地函數

[英]Calling a local function from a dot sourced file

我有一個正在運行的主腳本。 它的工作是通過充滿其他powershell腳本的目錄讀取的,dot包含了所有腳本,並在每個由點分隔文件名的第一部分組成的文件中運行預定義的方法。 例:

  1. 運行master.ps1
  2. Master.ps1點源。\\ resource \\ sub.ps1
  3. Sub.ps1定義了一個名為“ dosub”的函數
  4. Master.ps1使用Invoke-Expression運行'dosub'

sub.ps1中還定義了函數“ saysomething”。 在'dosub'中實現的是對'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!"
}

您的代碼可在我的系統上運行。 但是,您可以簡化一下:

$handlersDir = "handlers"

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

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

請注意BaseName屬性的可用性。 您也不需要使用Invoke-Expression 您只需通過調用( & )運算符即可調用命名命令。

您提供的內容可以根據需要工作。 您的計算機上可能沒有正確的目錄等。 或者,您正在運行其他內容,並在此處發布其他(有效!)代碼。

您還可以進行以下更正:

. .\$handlersDir\$handler

而不是上面,你可以做:

. $handler.fullname

而是可以分割文件名:

$exp = "do" + $handler.basename

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM