2013-03-03 11 views
6

モジュールからモジュールへの変換ではなく、ファイルから外部関数をインポートしたい(モジュールごとに何百ものファイルがあるので、 。関数内のファイルからグローバルスコープへのドットソーシング関数

ここにコードの説明があります。そのような種類のインポートを必要とする各スクリプトでこのコードの重複を避けるために、スクリプトルートフォルダの追加やファイルの存在の確認、特別なエラーのスローなど、インポート機能にいくつかの追加ロジックがあることに注意してください。

C:\リポジトリ\ Foo.ps1:

Function Foo { 
    Write-Host 'Hello world!' 
} 

C:\ InvocationTest.ps1:

# Wrapper func 
Function Import-Function ($Name) { 
    # Checks and exception throwing are omitted 
    . "C:\Repository\$name.ps1" 

    # Foo function can be invoked in this scope 
} 

# Wrapped import 
Import-Function -Name 'Foo' 
Foo   # Exception: The term 'Foo' is not recognized 

# Direct import 
. "C:\Repository\Foo.ps1" 
Foo   # 'Hello world!' 

グローバルスコープにソースをドットに任意のトリックは、ありますか?

答えて

4

スクリプトを親スコープで実行することはできませんが、スコープを明示的にスコープすることによってグローバルスコープで関数を作成できます。

この作品のようなものはありますか?

# Wrapper func 
Function Import-Function ($Path) { 
    # Checks and exception throwing are omitted 
    $script = Get-Content $Path 
    $Script -replace '^function\s+((?!global[:]|local[:]|script[:]|private[:])[\w-]+)', 'function Global:$1' 
    .([scriptblock]::Create($script)) 

} 

The above regexはrootのみ機能ターゲット(左詰めの機能を、単語functionの左側にある空白スペースなし)。それらがで定義されているように、あなたは、ドットソースのファイルで定義されている機能を変更することができ

$Script -replace '^\s*function\s+((?!global[:]|local[:]|script[:]|private[:])[\w-]+)','function Global:$1' 
+0

ありがとう、この素敵なハッチは働いています。あなたが気にしないなら、それを動作させるための小さな修正を加えました。 –

+0

気にしないでください。私はちょうど完全な完成した解決策ではなく、アイデアを伝えようとしていました。 – mjolinor

+0

@AntonPurinあなたは「マイナーな修正」を含むように答えを更新できますか? –

0

グローバルスコープで関数を実行する方法を覚えていません。あなたは、文字列.ToString()にスクリプトブロックを変換すると、変数が展開されます

$name = "myscript" 

$myimportcode= { 
    # Checks and exception throwing are omitted 
    . .\$name.ps1 
    # Foo function can be invoked in this scope 
} 

Invoke-Expression -Command $myimportcode.ToString() 

:あなたはこのような何かを行うことができます。

0

:関係なく、間隔(サブ関数を含む)、すべての機能を標的とするためには、へ$Script -replace行を変更グローバルスコープ:

関数内からドットソースを指定すると、ドットソースファイルで定義された関数はグローバルになります。これはいいアイデアだと言っているわけではなく、もう一つの可能​​性です。

関連する問題