2012-08-04 129 views
3

我試圖獲得一個在作業內部使用函數的簡單工作示例。我已經設法將我的函數傳遞給用於我的工作的腳本塊,但我似乎無法獲取該函數的參數。Powershell:將參數傳遞給存儲在變量中的函數

# concurrency 
$Logx = 
{ 
    param(
    [parameter(ValueFromPipeline=$true)] 
    $msg 
    )  
    Write-Host ("OUT:"+$msg) 
} 

# Execution starts here 
cls 
$colors = @("red","blue","green") 
$colors | %{ 
    $scriptBlock = 
    { 
     Invoke-Expression -Command $args[1] 
     Start-Sleep 3   
    } 

    Write-Host "Processing: " $_ 
    Start-Job -scriptblock $scriptBlock -args $_, $Logx 
} 

Get-Job 

while(Get-Job -State "Running") 
{ 
    write-host "Running..." 
    Start-Sleep 2 
} 

# Output 
Get-Job | Receive-Job 

# Cleanup jobs 
Remove-Job * 

下面是輸出:

Processing: red 
Id    Name   State  HasMoreData  Location    Command 
--    ----   -----  -----------  --------    ------- 
175    Job175   Running True   localhost    ... 
Processing: blue 
177    Job177   Running True   localhost    ... 
Processing: green 
179    Job179   Running True   localhost    ... 
179    Job179   Running True   localhost    ... 
177    Job177   Running True   localhost    ... 
175    Job175   Running True   localhost    ... 
Running... 
Running... 
OUT: 
OUT: 
OUT: 

那麼就證明OUT:X3在輸出我的函數獲取調用,但我還沒有發現任何語法這使我可以獲取該函數的參數。思考?

編輯:

注意,在肖恩的觀察之下,我的迴應,我嘗試使用功能變量,因爲使用傳統的功能似乎並沒有工作。如果有一種方法可以實現這一點,我將非常樂意不必將我的函數作爲變量傳遞。

回答

3

答案是使用Start-Job的初始化參數。如果你在一個塊中定義了所有的函數,並通過了它們可用的塊。

解決方案在這篇文章中發現:

How do I Start a job of a function i just defined?

這是我的例子來自以前,現在的工作:

# concurrency 
$func = { 
    function Logx 
    { 
     param(
     [parameter(ValueFromPipeline=$true)] 
     $msg 
     )  
     Write-Host ("OUT:"+$msg) 
    } 
} 

# Execution starts here 
cls 
$colors = @("red","blue","green") 
$colors | %{ 
    $scriptBlock = 
    { 
     Logx $args[0] 
     Start-Sleep 9   
    } 

    Write-Host "Processing: " $_ 
    Start-Job -InitializationScript $func -scriptblock $scriptBlock -args $_ 
} 

Get-Job 

while(Get-Job -State "Running") 
{ 
    write-host "Running..." 
    Start-Sleep 2 
} 

# Output 
Get-Job | Receive-Job 

# Cleanup jobs 
Remove-Job * 
0

如果您不用關鍵字function作爲函數名稱的前綴,PowerShell並不知道如此對待它。正如你編寫腳本一樣,它基本上是一個帶有特殊文本的變量。你的輸出顯示它只執行它在該變量內容中識別的命令:Write-Host "OUT:"

使用正確的語法會告訴PowerShell中它是一個功能,你有變量傳遞到它,你需要執行:


function Logx 
{ 
    param(
    [parameter(ValueFromPipeline=$true)] 
    $msg 
    )  
    Write-Host ("OUT:"+$msg) 
} 

然後,當你在腳本中調用它,你只需要使用Logx

+0

這似乎並沒有工作,這就是爲什麼我會通過把我的函數變成一個變量的麻煩。當我將Logx作爲一個傳統函數並嘗試用Logx $ args [0]代替調用表達式調用它時,我得到: 術語'Logx'不被識別爲cmdlet,函數,腳本文件的名稱,或者能夠運行的程序。檢查名稱的拼寫,或者如果包含路徑,請驗證 路徑是否正確,然後重試。 – 2012-08-04 01:29:18

+0

根據我的理解,Start-Job啓動另一個沒有引用父實例中定義的函數的powershell實例。這是我試圖解決的問題。 – 2012-08-04 02:01:23

0

到目前爲止。必須用完,稍後再嘗試。 PS:什麼在ARGS獲得通過[1],我得到的紅了不少,

CategoryInfo   : InvalidData: (:) [Invoke-Expression], ParameterBindingValidationException 
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand 

這裏是我到目前爲止管理。

# concurrency 
$Logx = 
{ 
    param(
    [parameter(ValueFromPipeline=$true)] 
    $msg 
    )  
    Write-Host ("OUT:"+$msg) 
} 

# Execution starts here 
cls 
$colors = @("red","blue","green") 
$colors | %{ 
    & $scriptBlock = 
    { Invoke-Expression -Command $args[1] 
     Start-Sleep 3 
    } 

    Write-Host "Processing: " $_ 
    Start-Job -scriptblock $scriptBlock -ArgumentList @($_, $Logx) 
} 

# Get-Job 

while(Get-Job -State "Running") 
{ 
    write-host "Running..." 
    Start-Sleep 2 
} 

# Output 
Get-Job | Receive-Job 

# Cleanup jobs 
Remove-Job * 
+0

Args [0]和args [1]是傳遞給腳本塊的參數的位置。所以args [1]是logx – 2012-08-04 14:27:49

相關問題