
次のような単純なものがあるとしますtest.ps1
。
Write-Host "access input for the 1st time: $input"
Write-Host "access input for the 2nd time: $input"
じゃあ私は'foo' | .\test.ps1
出力は次のようになります:
1 回目のアクセス入力: foo
2 回目のアクセス入力:
一度アクセスすると$input
、値が消えてしまいます。なぜでしょうか?
ドクこれは $input が列挙子であるためだと言っています:
$input は列挙子なので、そのプロパティにアクセスすると、$input は使用できなくなります。$input を別の変数に格納して、$input プロパティを再利用することができます。
しかし、調査員になるということがどういうことなのか理解できません。
私の知る限り、リストをパイプで入力すると、ブロックがないためリストは列挙されませんprocess{}
。たとえば、 を実行すると@(1,2,3) | .\test.ps1
、コードは 1 回だけ実行され、配列は単一のオブジェクトとして扱われます。
1回目のアクセス入力: 1 2 3
2回目のアクセス入力:
したがって、何が列挙されているのか、そしてなぜ $input が列挙子なのかがわかりません。
答え1
その説明の残りの部分を考慮して、おそらくチェックする必要があります高度な機能についてそして関数の高度なメソッドについて。
あなたの例はあまり意味をなさない。スクリプトを呼び出すと、匿名関数として動作します。$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
スクリプトで使用すると、入力として受け取った値が含まれます。発生していた問題は、すべての値がこれらのメソッドごとに 1 つの長い連結文字列として渡されたことです。
-
関数に渡されるすべての入力を列挙する列挙子が含まれます。この
$input
変数は、関数とスクリプト ブロック (名前のない関数) でのみ使用できます。
またあなたが理解できなかったもう一つの文は、[ $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: $_" } );
サポートリソース
.
(ソースまたはドット演算子)- ForEachオブジェクト
標準エイリアスForeach-Objectの場合: '
%
' 記号、ForEach - ForEach メソッド