簡體   English   中英

如何在腳本塊外調用函數

[英]How to call function outside a scriptblock

我有一個應該可以在Powershell腳本中的任何位置調用的函數。

問題在於它無法在腳本塊中標識該函數。

在以下示例中,我具有函數getNumberFive ,該函數應返回數字5。
我希望能夠在開始新作業時以及在腳本末尾在腳本塊內使用此功能。

預期結果:
將數字15寫入文件“ C:\\ tmp \\ result.txt”
寫到控制台:“我喜歡數字5”

事實上:
將數字10寫入文件“ C:\\ tmp \\ result.txt”
寫到控制台:“我喜歡數字5”

我可以通過在腳本塊中定義相同的函數來解決此問題,但是隨后我將復制該函數,這不是一個很好的編程方法。

另一種方法是定義:

$func = {
    function getNumberFive(){
        return 5
    }
}
$scriptBlock = {

    Function printSum(){
        $number = getNumberFive
        $newNumber = 10 + $number  # => $newNumber should be 15
        $newNumber >> "C:\tmp\result.txt"
      }
}
Start-Job -ScriptBlock $scriptBlock -InitializationScript $func

但是在這種情況下,我將無法調用$five = getNumberFive

我讀了許多方法,但是我不明白如何使用它們:
在同一腳本中定義后,在初作業腳本塊中調用powershell函數

如何將命名函數作為參數傳遞(腳本塊)

https://social.technet.microsoft.com/Forums/ie/en-US/485df2df-1577-4770-9db9-a9c5627dd04a/how-to-pass-a-function-to-a-scriptblock?forum=winserverpowershell

PowerShell:將函數作為參數傳遞

在帶參數的函數上使用Invoke-Command -ScriptBlock

我的劇本:

function getNumberFive(){
    return 5
}

$scriptBlock = {

    Function printSum(){
        # $number = getNumberFive => DOESN'T WORK
        # $number = Invoke-Expression ($(get-command getNumberFive) | Select -ExpandProperty Definition) => DOESN'T WORK AS EXPECTED
        # $number = &(${function:getNumberFive}) => DOESN'T WORK AS EXPECTED
        # $number = &(Get-Item function:getNumberFive) => DOESN'T WORK AS EXPECTED
        $newNumber = 10 + $number  # => $newNumber should be 15
        $newNumber >> "C:\tmp\result.txt"
    }

    printSum
}

Start-Job -ScriptBlock $scriptBlock 

$five = getNumberFive
Write-Host "I like the number"$five

Get-Job | Wait-Job
Get-Job | Stop-Job
Get-Job | Remove-Job

當您將腳本塊傳遞給start-job (或invoke-expression )時,執行該腳本塊的PowerShell實例只能訪問該腳本塊,腳本塊加載的所有內容以及PowerShell實例中已經存在的任何內容。

腳本的其他部分不包括在內。 (要使腳本本地定義的功能可從其他可能是PowerShell的PowerShell實例訪問,則整個腳本(不僅是腳本塊)還需要從其他實例訪問任何依賴項。)

您可以在兩個地方都將所需的代碼重構到腳本塊加載的模塊以及作業創建腳本中。

使用作業時,您正在另一個進程中執行代碼:像任何遠程操作一樣,遠程執行是一個獨立的環境。

您可以這樣:

function getNumberFive(){
    return 5
}

$a={
Function printSum($number){
        $newNumber = 10 + $number  # => $newNumber should be 15
        $newNumber >> "D:\result.txt"
    }
}

$scriptBlock = {
param($number)
    printSum -number $number
}
$five = getNumberFive
Write-Host "I like the number"$five

Start-Job -InitializationScript $a -ScriptBlock $scriptBlock -ArgumentList $five

Start-job中有一個開關名稱-InitializationScript ,您可以在其中將初始化代碼保留為函數。 將其包裝在一個腳本塊中,然后只需從主腳本塊中調用它即可。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM