2013-03-24 97 views
4

function關鍵字和腳本塊我有這樣的PowerShell腳本:美元符號,在PowerShell中

function Func1 ($val) 
{ 
    Write-Host "$val is processed by Func1"; 
} 

function Func2($val) 
{ 
    Invoke-Command -ScriptBlock ` 
    ${function:Func1} -ArgumentList "$val is processed by Func2 and"; 
} 

function Func3($val) 
{ 
    $function:Func2.Invoke("$val is processed by Func3 and"); 
} 

Func3 "Value"; 

這工作 - 它輸出值由FUNC3處理,並通過FUNC2處理,並通過FUNC1處理 - 但

什麼的$:我的兩兩件事混淆{功能:函數名}代碼(即一個美元符號後面的大括號後面功能後跟一個冒號後面的名字f Func2的意思是後跟一個大括號)我可以看到它調用了Func1,但我不明白它爲什麼起作用。

什麼是$ function:function-name.Invoke Func3中的代碼是什麼意思?我知道它使用腳本塊功能,因爲Invoke方法被調用,但我不清楚如何$ function.function-name是一個腳本塊。

回答

5

function:是功能提供者的PsDrive。所有功能都存儲在這個驅動器上。還有其他PsDrives,包括variable:env:。查看Get-PsProviderGet-PsDrive瞭解更多信息。

要訪問function:驅動器中的函數(獲取其內容,請不要調用它),請使用$function:foo其中foo是要訪問的函數的名稱。

僅當您訪問名稱中包含特殊字符的變量時才需要大括號。

函數的內容是腳本塊,這就是爲什麼它被用作Invoke-Command的腳本塊參數的原因。

psdrive的function:中的每一件東西都是一個腳本塊,scriptblock對象有一個Invoke方法可以讓你執行它們。

+0

我仍然對此感到困惑 - 「要從函數:驅動器訪問函數(獲取它的內容,而不是調用它),請使用$ function:foo」。這是獲取函數的內容,還是獲得具有函數功能的腳本塊?如果它只獲取內容,那麼如何在Func3中調用Invoke呢?此外,我還不清楚$ {function:foo}(即美元符號後面的大括號)的含義。 – 2013-03-24 16:42:37

+0

啊,好的@ andy-arismendi,你的編輯更好地解釋了我的事情。有沒有這方面的參考,或者你是否通過試驗和錯誤發現了它?我搜索了高低,但我找不到任何官方文檔。這不利於網絡搜索美元符號和冒號。 – 2013-03-24 16:58:01

+0

內容是腳本塊。 '$ function:Func2 | gm'顯示你正在訪問的內容。只需'PS> $ function:Func2'調用腳本塊的ToString方法,以便僅顯示文本內容。 – 2013-03-24 16:58:07