問題タブ [scriptblock]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
powershell - $_ 自動変数を使用して PowerShell スクリプトブロックを呼び出す方法
機能するもの -
コマンドレットscriptblock
で使用するがあるとしましょう。Select-Object
これはうまく機能し、期待どおりの結果が得られます。
私がやろうとしていること -
scriptblock
ただし、コードの後半で、定義された asを再利用したいと考えてい$jobTypeSelector
ます。
たとえば、以下のコードは、以下のパラメーターとして渡されたもの$fooJob
(単一のオブジェクトであることに注意してください$_
) を受け取り、 の自動変数に使用され、コマンドレットscriptblock
のコンテキストで実行されたときに返されるのと同じ結果を返すことを期待していました。Select-Object
うまくいかないこと -
期待どおりに機能せず、空の値が返されます。
私がすでに試したこと -
確認したところ、プロパティはすべて正しく設定されており、関連するプロパティ自体が空白または
$null
.インターネットで調べたところ、この件に関する関連ページを見つけるのはかなり難しいようでしたが、最終的には、わずかに異なるコンテキストで問題を説明するのに近いページを見つけました - PowerShell でスクリプト ブロックを呼び出します。ブログは私の質問に直接答えていません。関連する説明は、私の意見では、非常に醜く、読みにくく、維持するのが難しい解決策につながるだけです。
質問 -
したがって、(ブロックの代わりに)自動変数をパラメーターとして使用scriptblock
する単一のオブジェクトに対してを呼び出す最良の方法は何ですか$_
param
powershell - パイプライン パラメーター バインドをサポートするコマンドレット "デリゲート" を作成する方法はありますか?
.NET では、サブルーチンの実装が呼び出しごとに変わる可能性がある場合、サブルーチンを使用するメソッドにデリゲートを渡すことができます。 これは Powershell で行うこともできます。Powershellの無名関数に相当するものとして説明されているスクリプト ブロックを使用することもできます。ただし、慣用的な powershell は、powershell のパイプライン パラメーター バインディングを利用します。しかし、デリゲートもスクリプト ブロックも、Powershell のパイプライン パラメーター バインディングを利用していないようです。
パイプライン パラメーター バインディングのサポートを保持する方法で、powershell コマンドレットを別のコマンドレットに渡す (慣用的な) 方法はありますか?
これが私がやりたいことのコードスニペットです:
variables - モジュール内のスクリプトブロックのコンテキストで変数を選択的にキャプチャする方法はありますか?
モジュール (つまり.psm1
ファイル)で 2 つの関数を定義したとします。
ここで、次を実行するとします。
$x2
内部で呼び出されたにもかかわらず、コマンド ラインのコンテキストを保持します$f2
。&
に変更した場合も同様です.
。
モジュール内で に置き換え$xn
て$xn.GetNewClosure()
から呼び出すとf1
、 の値はキャプチャされますが、 はキャプチャされ100
ません10
。
これは、.GetNewClosure()
insideを呼び出すと、キャプチャされた inf2
の値が「上書き」されるために発生します。$a1
f1
スクリプトブロックで変数を選択的にキャプチャする方法はありますか? $a1
例から作業して、内部f1
と$a2
内部の両方をキャプチャする方法はありf2
ますか?
参考文献
PowerShell スコープは単純ではありません。この不完全な要因のリストから可能性を検討してください。
- いつでもアクティブなグローバル スコープ階層とモジュール スコープ階層の任意の組み合わせが存在する可能性があります
.
&
呼び出しはスコープに異なる影響を与えます。- パイプラインによって提供される高度なフロー制御は、異なるまたは同じスコープ階層の
begin
、process
、およびスクリプト ブロックの複数のスコープ、または同じ関数の複数の呼び出しを同時にアクティブにできることを意味します。end
言い換えれば、PowerShell スコープの実用的な説明は単純さに反します。
about_Scopesのドキュメントは、問題が実際よりもはるかに単純であることを示唆しています。おそらく、この問題のコードを分析して理解することで、より完全な理解につながるでしょう。
powershell - $null splat パラメータを使用する場合、Powershell はいつデフォルト値を尊重しますか?
次の関数を検討してください。
次に、splat パラメータを使用して呼び出します。
予想通り、何も返されません。$null
では、 splat パラメーターを使用してもう一度試してください。
奇妙なことに、scriptblock
返されます。明らかに、少なくとも[scriptblock]
パラメーターについては、splat パラメーターが使用されている場合、powershell はデフォルト値を尊重していません$null
。ただし、powershell は .xml のデフォルト値を尊重します[string]
。ここで何が起こっているのですか?
$null splat パラメーターを使用する場合、Powershell はどの型に対してデフォルト値を尊重しますか?
powershell - スクリプトブロック内の Powershell 呼び出しバッチ
私は以下のスクリプトを持っていますが、それは私が望むようには機能していません。最初に、メインの Powershell ウィンドウがフリーズしないように、バックグラウンドで「Start-Job」を使用する関数に install.cmd を渡したいと思います。しかし、install.cmd を呼び出すことができません。
powershell - ジョブの開始時に timeout と引数リストに変数を渡す
次のスクリプトを使用して、CSV に保存されているコンピューターのリストを ping しようとしています。望ましい結果は、タイムアウト条件を確認できることです。
このスクリプトはエラーになります:
「-」演算子の右側に値式を指定する必要があります。」
引数リストをここに移動すると:
というエラーが表示されます
パラメータ 'ComputerName' の引数を検証できませんでした。引数が null または空です。
スクリプトブロックに変数を渡すことに関する記事や質問を見たことがありますが、それらは for でInvoke-Command
あり notStart-Job
であり、翻訳で機能させるにはまだ必要です。それが機能した場合、期待している出力が表示されないという印象を受けていWrite-Host
ます。
powershell - スクリプトブロックで複数のコマンドを実行し、複数の応答を返す
リモート ホストに接続し、2 つのコマンドを実行して、個別の応答を返したいと思います。ただし、これを 1 つのスクリプト ブロックの一部として実行したいと考えています。以前は 1 つのコマンドでこれを実行しましたが、2 つのコマンドでは満足できませんでした。たとえば、
と
スクリプトブロックに結合し、そのスクリプトブロックをInvoke-Commandに渡し、その呼び出しから個々の応答を抽出します。