2012-02-21 55 views
9

我已經把我的功能在一個單獨的文件,我調用文件用:將功能點採購他們 - 將範圍是什麼

$workingdir = Split-Path $MyInvocation.MyCommand.Path -Parent 
. "$workingdir\serverscan-functions.ps1"       

可是,如果我叫腳本像

my-function 

變量作用域(來自「我的函數」內)將如何? 我還應該使用$ script:variable來使變量存在於函數之外還是使點函數爲好?

希望我不會跟我的問題混淆的人......我試圖使它的理解越好,但是仍然在學習所有的基本概念,所以我覺得很難解釋..

回答

18

當你點源代碼,它的行爲就好像該代碼仍然在原始腳本中一樣。範圍將與全部在一個文件中一樣。

C:\ functions.ps1代碼:

$myVariable = "Test" 

function Test-DotSource { 
    $script:thisIsAvailableInFunctions = "foo" 
    $thisIsAvailableOnlyInThisFunction = "bar" 
} 

main.ps1代碼

$script:thisIsAvailableInFunctions = "" 

. C:\functions.ps1 

# Call the function to set values. 
Test-DotSource 

$script:thisIsAvailableInFunctions -eq "foo" 
# Outputs True because of the script: scope modifier 

$thisIsAvailableOnlyInThisFunction -eq "bar" 
# Outputs False because it's undefined in this scope. 

$myVariable -eq "Test"      
# Outputs true because it's in the same scope due to dot sourcing. 
+0

導入因此,這意味着在函數外部創建的所有變量文件(serverscan-functions.ps1)可以在函數之外訪問嗎? 有沒有一種方法可以防止這種情況,並且還有我的功能在一個單獨的文件中? – Sune 2012-02-21 20:17:18

+1

@Sune我用一些例子更新了我的答案。希望它有幫助。 – 2012-02-21 20:42:56

+0

正是我在找的! – Sune 2012-02-23 23:52:53

2

爲了達到你想要什麼,你可能需要創建一個模塊。在模塊中,使用Export-ModuleMember導出函數,並且只要不顯式導出任何變量作爲模塊成員,則應該沒問題。

創建模塊後,使用Import-Module cmdlet將其導入。

1

我的2分錢小費:

通常(過去的安迪·阿里斯門迪後回答上帝保佑你的男人!)我救我的$pwd文件夾中的所有腳本(在系統路徑環境添加)。我可以通過控制檯調用它們,但腳本結束工作後沒有任何腳本變量中毒控制檯。

如果您不能修改簡單的腳本你的函數(有時會發生),我與特雷弗答案同意創建一個模塊,並在$profile