支持資源

支持資源

假設我有一個簡單的test.ps1

Write-Host "access input for the 1st time: $input"
Write-Host "access input for the 2nd time: $input"

那我就做'foo' | .\test.ps1

將輸出:

第一次訪問輸入: foo
第二次訪問輸入:

訪問$input一次後,該值就沒有了。為什麼?

醫生說這是因為 $input 是一個枚舉器:

由於 $input 是一個枚舉器,存取它的任何屬性都會導致 $input 不再可用。您可以將 $input 儲存在另一個變數中以重複使用 $input 屬性。

但我不明白成為枚舉員意味著什麼。

據我所知,如果我輸入一個列表,該列表將不會被列舉,因為我沒有塊process{}。例如,如果我這樣做@(1,2,3) | .\test.ps1,我的程式碼將僅運行一次,並且該數組被視為單個物件。

第一次訪問輸入: 1 2 3
第二次訪問輸入:

所以我不明白正在列舉什麼,以及為什麼 $input 是一個枚舉器。

答案1

您需要考慮該描述中的其餘內容,也許可以查看一下about_功能_進階about_Functions_Advanced_Methods

你的例子沒有太大意義。呼叫腳本將其作為匿名函數使用。當你只讓它使用$input第一種情況時會發生什麼:

在沒有 begin、process 或 end 區塊的函數中,$input 變數枚舉函數的所有輸入的集合。

Write-Host接受枚舉並迭代它。因此你似乎只得到一個值。本質上它是在呼叫“.toString()”。

使用循環你會發現你確實得到了單獨的值。

$counter = 0;
$input | ForEach-Object {
    Write-Host "access input for the $counter time: $_"
    $counter = $counter + 1
}

如果您確實需要此功能,那麼使用進程區塊可能會更好。檢查高級功能幫助以獲取有關其含義的更多資訊。

begin {
    $counter = 0
}
process {
    Write-Host "access input for the $counter time: $_"
    $counter = $counter + 1
}

請記住,在這種情況下,$input工作方式會略有變化。

根據有關枚舉器的信息擁有具有合適定義的常規函數參數通常比直接使用$input.

答案2

透過管道迭代“事物列表”清單到一個foreach-object循環使用其 中的腳本/函數呼叫scriptblock

在其中scriptblock,將迭代值透過管道傳遞給函數調用,如下所示輸入取得每次呼叫傳回的輸出值的預期值。

此 PowerShell 解決方案將腳本邏輯封裝在簡單的功能語句區塊,而且您不必Write-Output重複程式碼數 - 標準、簡單和基本。

因此,沒有必要特別關心區塊process{}

PowerShellTest.ps1腳本

Function Test {
    Write-Output "Access to your mom's: $input"
    };

電源外殼點源編寫腳本並調用它

. "$Env:USERPROFILE\Desktop\test.ps1"
@("car","house","bank account") | % { $_ | test  }

輸出

Access to your mom's: car
Access to your mom's: house
Access to your mom's: bank account

邏輯崩潰

在此輸入影像描述

但我不明白成為枚舉員意味著什麼。

此外,根據$input陳述下面引用和引用,這意味著它將成為作為輸入傳遞的輸入值的佔位符,因此它會列舉傳遞的值。您$input在腳本中使用,它包含作為輸入接收的值。您遇到的問題是,所有值都作為每個這些方法的一個長連接字串傳遞。

  • 包含一個枚舉器,用於枚舉傳遞給函數的所有輸入。此$input變數僅可用於函數和腳本區塊(未命名函數)。

    來源

,你不明白的其他說法只是說it [ $input] 僅在呼叫它的實例中保留該值。您無法$input在呼叫之前或之後取得任何值,它僅設定為呼叫時輸入的值。

最後,您可以在函數呼叫上設定變數$input為您提供呼叫時「枚舉」的輸出(即$var = "jewelry box" | test)。這意味著變數在呼叫之外可用,其值$input是執行時的值。

其他潛在的獎金解決方案

## Input piped to script function call
@("car","house","bank account").ForEach( {$_ | test} );

## Uses "$_" as the placeholder to contain the value iterated right to the command no script or function needed
@("car","house","bank account").ForEach( { Write-Output "Access to your mom's: $_" } );

支持資源

相關內容