2013-02-14 84 views
2

我想編寫一個powershell函數,該函數通過基於作爲輸入參數傳入的scriptblock動態創建一個腳本塊來返回腳本塊。我似乎沒有多少運氣。從腳本塊動態創建PowerShell腳本塊

很容易編寫一個方法來調用scriptblock兩次。

$x = { write-host "Hello" } 
function DoIt([scriptblock] $s) { $s.Invoke(); } 
function DoItTwice([scriptblock] $s) { $s.Invoke(); $s.Invoke(); } 

DoIt($x) 
DoItTwice($x) 

很難編寫一個方法,該方法返回兩次調用(輸入)scriptblock的效果的scriptblock。以下不工作

function TwiceAsScriptBlock([scriptblock] $s) 
{ 
    function twice 
    { 
     $s.Invoke(); 
     $s.Invoke(); 
    } 
    return { twice } 
} 

回答

6

這將這樣的伎倆爲您提供:

function TwiceAsScriptBlock([scriptblock] $s) 
{ 

    $ScriptBlock = [System.Management.Automation.ScriptBlock]::Create("$s ; $s") 
    Return $ScriptBlock 
} 

Powershell Return Scriptblock

+0

我想沿着這些線路的變體。如果我在返回的scriptblock上調用了Invoke(),我得到以下錯誤: 'TwiceAsScriptBlock:無法處理參數's'的參數轉換.' – Rob 2013-02-14 16:17:50

+0

它爲我工作,我會放一個截圖。 你運行的是什麼版本的powersehll? – 2013-02-14 16:19:53

+0

檢查更新的答案,正如您在我調用新的scriptblock時看到的那樣,它會輸出消息兩次。 – 2013-02-14 16:23:03