次の方法で共有


第 4 章 - One-Liners とパイプライン

PowerShell の学習を始めた当初は、単純な PowerShell コマンドでは複雑すぎると思われるタスクにグラフィカル ユーザー インターフェイス (GUI) を使用していました。 しかし、学び続ける中で、スキルを磨き、基本的なワンライナーからスクリプト、機能、モジュールの作成に移りました。 オンラインの高度な例に圧倒される感じが普通であることを覚えておくことを忘れないでください。 PowerShell のエキスパートとして始まる人はいません。私たちは皆、初心者として始まります。

管理タスクに主に GUI を使用する場合は、管理ワークステーションに管理ツールをインストールして、サーバーをリモートで管理します。 サーバーが GUI または Server Core OS のインストールを使用しているかどうかに関係なく、このアプローチは有益です。 PowerShell を使用して管理タスクを実行する準備として、リモート サーバー管理について理解を深める実用的な方法です。

前の章と同様に、ラボ環境でこれらの概念を試してください。

One-Liners

PowerShell ワンライナーは、1 つの連続パイプラインです。 1 つの物理行のコマンドが PowerShell ワンライナーであるという一般的な誤解ですが、これは常に正しいとは限りません。

たとえば、次の例を考えてみましょう。コマンドは複数の物理行に拡張しますが、連続パイプラインを形成するため PowerShell ワンライナーです。 読みにくい長いワンライナーは、PowerShell において自然なブレークポイントであるパイプシンボルで改行することで、読みやすさと明瞭さを向上させることができます。 この戦略的な改行の使用により、パイプラインのフローを中断することなく読みやすさが向上します。

Get-Service |
    Where-Object CanPauseAndContinue -EQ $true |
    Select-Object -Property *
Name                : LanmanWorkstation
RequiredServices    : {NSI, MRxSmb20, Bowser}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Workstation
DependentServices   : {SessionEnv, Netlogon}
MachineName         : .
ServiceName         : LanmanWorkstation
ServicesDependedOn  : {NSI, MRxSmb20, Bowser}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Automatic
Site                :
Container           :

Name                : Netlogon
RequiredServices    : {LanmanWorkstation}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Netlogon
DependentServices   : {}
MachineName         : .
ServiceName         : Netlogon
ServicesDependedOn  : {LanmanWorkstation}
ServiceHandle       :
Status              : Running
ServiceType         : Win32ShareProcess
StartType           : Automatic
Site                :
Container           :

Name                : vmicheartbeat
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Heartbeat Service
DependentServices   : {}
MachineName         : .
ServiceName         : vmicheartbeat
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : vmickvpexchange
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Data Exchange Service
DependentServices   : {}
MachineName         : .
ServiceName         : vmickvpexchange
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : vmicrdv
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Remote Desktop Virtualization Service
DependentServices   : {}
MachineName         : .
ServiceName         : vmicrdv
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : vmicshutdown
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Guest Shutdown Service
DependentServices   : {}
MachineName         : .
ServiceName         : vmicshutdown
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : vmicvss
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : False
CanStop             : True
DisplayName         : Hyper-V Volume Shadow Copy Requestor
DependentServices   : {}
MachineName         : .
ServiceName         : vmicvss
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : webthreatdefsvc
RequiredServices    : {RpcSs, wtd}
CanPauseAndContinue : True
CanShutdown         : True
CanStop             : True
DisplayName         : Web Threat Defense Service
DependentServices   : {}
MachineName         : .
ServiceName         : webthreatdefsvc
ServicesDependedOn  : {RpcSs, wtd}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

Name                : webthreatdefusersvc_644de
RequiredServices    : {}
CanPauseAndContinue : True
CanShutdown         : True
CanStop             : True
DisplayName         : Web Threat Defense User Service_644de
DependentServices   : {}
MachineName         : .
ServiceName         : webthreatdefusersvc_644de
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : 240
StartType           : Automatic
Site                :
Container           :

Name                : Winmgmt
RequiredServices    : {RPCSS}
CanPauseAndContinue : True
CanShutdown         : True
CanStop             : True
DisplayName         : Windows Management Instrumentation
DependentServices   : {}
MachineName         : .
ServiceName         : Winmgmt
ServicesDependedOn  : {RPCSS}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Automatic
Site                :
Container           :

自然な改行は、コンマ (,) や左かっこ ([)、中かっこ ({)、かっこ (() など、一般的に使用される文字で発生する可能性があります。 あまり一般的ではないその他の例には、セミコロン (;)、等号 (=)、および一重引用符と二重引用符 (',") の両方が含まれます。

行の継続としてバックティック (`) またはグレーブアクセント文字を使用することは、論争があります。 可能であれば避けるのが最善です。 自然な改行文字の後にバックティックを使用するのはよくある間違いです。 この冗長性は不要であり、コードを煩雑にする可能性があります。

次の例のコマンドは、PowerShell コンソールから正しく実行されます。 ただし、PowerShell Integrated Scripting Environment (ISE) のコンソール ウィンドウで実行しようとすると、エラーが発生します。 この違いは、PowerShell コンソールとは異なり、ISE のコンソール ウィンドウではコマンドの次の行への継続が自動的に予測されないために発生します。 この問題を回避するには、コマンドを複数行にわたって拡張する必要がある場合は、Enter ではなく ISE のコンソール ウィンドウで +Enter キーを押します。 このキーの組み合わせは、コマンドが次の行で続行されていることを ISE に通知し、エラーにつながる実行を防ぎます。

Get-Service -Name w32time |
    Select-Object -Property *
Name                : w32time
RequiredServices    : {}
CanPauseAndContinue : False
CanShutdown         : True
CanStop             : True
DisplayName         : Windows Time
DependentServices   : {}
MachineName         : .
ServiceName         : w32time
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Running
ServiceType         : Win32OwnProcess, Win32ShareProcess
StartType           : Manual
Site                :
Container           :

次の例は、1 つの連続パイプラインではないため、PowerShell のワンライナーとしては適格ではありません。 代わりに、セミコロンで区切られた 2 つの個別のコマンドが 1 行に配置されます。 このセミコロンは、1 つのコマンドの末尾と別のコマンドの先頭を示します。

$Service = 'w32time'; Get-Service -Name $Service
Status   Name               DisplayName
------   ----               -----------
Running  w32time            Windows Time

多くのプログラミング言語とスクリプト言語では、各行の末尾にセミコロンが必要です。 ただし、PowerShell では、行の末尾のセミコロンは不要であり、推奨されません。 よりクリーンで読みやすいコードを目指すために、それらを避けるべきです。

左フィルター

この章では、さまざまなコマンドの結果をフィルター処理する方法について説明します。

PowerShell では、パイプラインでできるだけ早く結果をフィルター処理することをお勧めします。 これを実現するには、最初のコマンド (通常はパイプラインの先頭) でパラメーターを使用してフィルターを適用する必要があります。 これは一般に、左フィルタリングと呼ばれます。

この概念を説明するために、次の例を考えてみましょう。Get-Service パラメーターを使用して、パイプラインの先頭で結果をフィルター処理し、Windows タイム サービスの詳細のみを返します。 このメソッドは、効率的なデータ取得を示し、必要な関連情報のみを確実に返します。

Get-Service -Name w32time
Status   Name               DisplayName
------   ----               -----------
Running  w32time            Windows Time

結果をフィルター処理するために、powerShell コマンドが Where-Object コマンドレットにパイプ処理されているオンラインの例を確認するのが一般的です。 パイプラインの以前のコマンドにフィルター処理を実行するパラメーターがある場合、この手法は非効率的です。

Get-Service | Where-Object Name -EQ w32time
Status   Name               DisplayName
------   ----               -----------
Running  W32Time            Windows Time

最初の例では、ソースで直接フィルター処理し、Windows タイム サービス専用の結果を返す方法を示します。 これに対し、2 番目の例では、すべてのサービスを取得し、別のコマンドを使用して結果をフィルター処理します。 これは小規模なシナリオでは重要ではないと思われるかもしれませんが、Active Directory などの大規模なデータセットが関係する状況を検討してください。 数千のユーザー アカウントの詳細を取得して、小さなサブセットに絞り込むのは非効率的です。 見た目には単純なケースであっても、フィルターを左から実践し、コマンドシーケンスにおいて可能な限り早くフィルターを適用することを心がけます。 この習慣により、より重要になる複雑なシナリオで効率が確保されます。

効果的なフィルター処理のためのコマンド シーケンス処理

PowerShell のコマンドの順序は重要ではないという誤解がありますが、これは誤解です。 特にフィルター処理の場合は、コマンドを配置する順序が重要です。 たとえば、 Select-Object を使用して特定のプロパティを選択し、フィルター処理する Where-Object を使用しているとします。 その場合は、まずフィルター処理を適用する必要があります。 これを行わないと、パイプラインでフィルター処理に必要なプロパティが使用できず、結果が無効または誤りになる可能性があります。

次の例では、Select-Objectにパイプされるときに Where-Object プロパティが存在しないため、結果を生成できません。 これは、 CanPauseAndContinue プロパティが、 Select-Objectによって行われた選択に含まれていないためです。 実質的には、除外またはフィルタリングされます。

Get-Service |
    Select-Object -Property DisplayName, Running, Status |
    Where-Object CanPauseAndContinue

Select-ObjectWhere-Objectの順序を逆にすると、目的の結果が生成されます。

Get-Service |
    Where-Object CanPauseAndContinue |
    Select-Object -Property DisplayName, Status
DisplayName                                    Status
-----------                                    ------
Workstation                                   Running
Netlogon                                      Running
Hyper-V Heartbeat Service                     Running
Hyper-V Data Exchange Service                 Running
Hyper-V Remote Desktop Virtualization Service Running
Hyper-V Guest Shutdown Service                Running
Hyper-V Volume Shadow Copy Requestor          Running
Web Threat Defense Service                    Running
Web Threat Defense User Service_644de         Running
Windows Management Instrumentation            Running

パイプライン

本書の多くの例で見られるように、1 つのコマンドの出力を別のコマンドの入力として使用することがよくあります。 第 3 章では、 Get-Member を使用して、コマンドによって生成されるオブジェクトの種類を決定しました。

第 3 章では、Get-Command パラメーターを使用して、その種類の入力を受け入れたコマンドを決定する方法についても説明しました。 コマンドの詳細なヘルプによっては、 INPUTS セクションと OUTPUTS セクションが含まれる場合があります。

INPUTS セクションは、ServiceController または String オブジェクトを Stop-Service コマンドレットにパイプできることを示します。

help Stop-Service -Full

次の出力は、ヘルプの関連部分を示すために省略されています。

...
INPUTS
    System.ServiceProcess.ServiceController
        You can pipe a service object to this cmdlet.

    System.String
        You can pipe a string that contains the name of a service to this
        cmdlet.


OUTPUTS
    None
        By default, this cmdlet returns no output.

    System.ServiceProcess.ServiceController
        When you use the PassThru parameter, this cmdlet returns a
        ServiceController object representing the service.
...

ただし、この種類の入力を受け入れるパラメーターは指定されていません。 この情報は、 Stop-Service コマンドレットのヘルプのフル バージョンでさまざまなパラメーターを確認することで確認できます。

help Stop-Service -Full

ここでも、関連するヘルプのみが次の結果に表示されます。 DisplayName パラメーターがパイプライン入力を受け入れないことに注意してください。 InputObject パラメーターは、ServiceController オブジェクトの値によってパイプライン入力を受け入れます。 Name パラメーターは、 String オブジェクトの値によるパイプライン入力と 、プロパティ名によるパイプライン入力を受け入れます。

...
-DisplayName <System.String[]>
    Specifies the display names of the services to stop. Wildcard
    characters are permitted.

    Required?                    true
    Position?                    named
    Default value                None
    Accept pipeline input?       False
    Accept wildcard characters?  true

-InputObject <System.ServiceProcess.ServiceController[]>
    Specifies ServiceController objects that represent the services to
    stop. Enter a variable that contains the objects, or type a command
    or expression that gets the objects.

    Required?                    true
    Position?                    0
    Default value                None
    Accept pipeline input?       True (ByValue)
    Accept wildcard characters?  false

-Name <System.String[]>
    Specifies the service names of the services to stop. Wildcard
    characters are permitted.

    Required?                    true
    Position?                    0
    Default value                None
    Accept pipeline input?       True (ByPropertyName, ByValue)
    Accept wildcard characters?  true
...

パイプライン入力を処理する場合、 プロパティ名 の両方でパイプライン入力を受け入れるパラメーターは、最初に 値バインディングによって 優先順位を付けます。 このメソッドが失敗した場合、 プロパティ名によるパイプライン入力の処理が試みられます。 ただし、 値による 用語は誤解を招く可能性があります。 より正確な説明は 種類別です

たとえば、 ServiceController オブジェクトを生成するコマンドの出力をパイプ処理して Stop-Serviceする場合、この出力は InputObject パラメーターにバインドされます。 パイプされたコマンドによって String オブジェクトが生成された場合、出力は Name パラメーターに関連付けられます。 ServiceController オブジェクトまたは String オブジェクトを生成せず、Name という名前のプロパティを含むコマンドからの出力をパイプ処理する場合は、NameStop-Service値を Name パラメーターにバインド

Get-Service コマンドによって生成される出力の種類を決定します。

Get-Service -Name w32time | Get-Member

Get-ServiceServiceController オブジェクト型を生成します。

   TypeName: System.ServiceProcess.ServiceController

Stop-Serviceコマンドレットのヘルプに示すように、InputObject パラメーターは値によってパイプラインを介して ServiceController オブジェクトを受け入れます。 これは、Get-Service コマンドレットの出力をパイプ処理してStop-Serviceすると、によって生成された Get-Service オブジェクトStop-Service パラメーターにバインドされることを意味します。

Get-Service -Name w32time | Stop-Service

次に、文字列入力を試します。 w32timeGet-Member に渡して、それが文字列であることを確認する。

'w32time' | Get-Member
   TypeName: System.String

PowerShell のヘルプ ドキュメントでは、文字列をパイプしてStop-Serviceすると、値によってName パラメーターにバインドされることを示しています。 実際のテストを行ってこれを見てみましょう。文字列w32timeStop-Serviceにパイプします。 この例では、停止 Stop-Service サービスの名前として文字列 w32time を処理する方法を示します。 次のコマンドを実行して、このバインドとコマンドの実行が動作することを確認します。

w32timeは一重引用符で囲まれています。 PowerShell では、静的文字列には単一引用符を使用し、拡張を必要とする変数が文字列に含まれている場合は二重引用符を予約することをお勧めします。 単一引用符は、変数を解析せずにコンテンツをリテラルに扱うように PowerShell に指示します。 この方法では、スクリプトが文字列を解釈する方法の精度が保証されるだけでなく、PowerShell では単一引用符内の文字列に対する処理作業が少なくなるので、パフォーマンスも向上します。

'w32time' | Stop-Service

Stop-Service パラメーターのプロパティ名でパイプライン入力をテストするカスタム オブジェクトを作成します。

$customObject = [pscustomobject]@{
    Name = 'w32time'
}

CustomObject 変数の内容は PSCustomObject オブジェクト型であり、Name という名前のプロパティが含まれています。

$customObject | Get-Member
   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()
GetType     Method       type GetType()
ToString    Method       string ToString()
Name        NoteProperty string Name=w32time

この例の $customObject など、PowerShell で変数を操作する場合、変数を引用符で囲む必要がある場合は、二重引用符を使用することが重要です。 二重引用符を使用すると変数を拡張できます。PowerShell は変数を評価し、その値を使用します。 たとえば、 $customObject を二重引用符で囲んでパイプ処理して Get-Memberすると、PowerShell は $customObjectの値を処理します。 対照的に、単一引用符を使用すると、リテラル文字列$customObjectGet-Memberへとパイプで渡すことになり、変数の値にはなりません。 この区別は、変数の値を評価する必要があるシナリオで重要です。

$customObject変数の内容を Stop-Service コマンドレットにパイプする場合、Name パラメーターへのバインドは値ではなくプロパティ名によって行われます。 これは、 $customObjectName という名前のプロパティを含むオブジェクトであるためです。 このシナリオでは、PowerShell は内の $customObject プロパティを識別し、その値を Stop-Service パラメーターに使用します。

サービスなどの別のプロパティ名を使用して、別のカスタム オブジェクトを作成します。

$customObject = [pscustomobject]@{
    Service = 'w32time'
}

w32time$customObjectにパイプして、Stop-Service サービスを停止しようとするとエラーが発生します。 $customObjectServiceController または String オブジェクトを生成せず、Name プロパティが含まれていないため、パイプライン バインドが失敗します。

$customObject | Stop-Service
Stop-Service : Cannot find any service with service name
'@{Service=w32time}'.
At line:1 char:17
+ $customObject | Stop-Service
+                 ~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (@{Service=w32time}:String) [
   Stop-Service], ServiceCommandException
    + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShe
   ll.Commands.StopServiceCommand

あるコマンドの出力プロパティ名が別のコマンドのパイプライン入力要件と一致しない場合は、 Select-Object を使用してプロパティ名の名前を変更して、それらが正しく並び上がるようにすることができます。

次の例では、 Select-Object を使用して 、Service プロパティの名前を Name という名前のプロパティに変更 します

一見すると、この例の構文は複雑に見える可能性があります。 ただし、構文を学習するには、コードのコピーと貼り付け以上のものが必要であることを理解することが不可欠です。 代わりに、時間をかけてコードを手動で入力してください。 この実践的な練習は、構文を覚えておくのに役立ち、繰り返しの作業でより直感的になります。 複数のモニターや分割画面を使用すると、学習プロセスにも役立ちます。 ある画面にサンプル コードを表示し、別の画面でアクティブに入力して実験します。 このセットアップにより、構文の理解と保持が容易になり、理解が深くなります。

$customObject |
    Select-Object -Property @{Name='Name';Expression={$_.Service}} |
    Stop-Service

パイプライン入力を受け入れないパラメーターを使用する必要がある場合があります。 このような場合でも、あるコマンドの出力を別のコマンドの入力として使用できます。 まず、いくつかの特定の Windows サービスの表示名をキャプチャしてテキスト ファイルに保存します。 この手順では、保存されたデータを別のコマンドの入力として使用できます。

'Background Intelligent Transfer Service', 'Windows Time' |
    Out-File -FilePath $env:TEMP\services.txt

かっこを使用して、1 つのコマンドの出力をパラメーターの入力として別のコマンドに渡すことができます。

Stop-Service -DisplayName (Get-Content -Path $env:TEMP\services.txt)

この概念は、代数の演算の順序に似ています。 かっこ内の数学演算が最初に計算されるのと同様に、かっこで囲まれたコマンドは外側のコマンドの前に実行されます。

PowerShellGet

PowerShell バージョン 5.0 以降に含まれるモジュールである PowerShellGet には、PowerShell モジュールと NuGet リポジトリ内のその他の項目を検出、インストール、更新、発行するためのコマンドが用意されています。 PowerShell バージョン 3.0 以降を使用している場合は、PowerShellGet を個別にダウンロードすることもできます。

PowerShell ギャラリーは、Microsoft がホストするオンライン リポジトリであり、PowerShell モジュール、スクリプト、およびその他のリソースを共有するための中央ハブとして設計されています。 Microsoft は PowerShell ギャラリーをホストしていますが、PowerShell コミュニティは、利用可能なモジュールとスクリプトの大部分を提供しています。 これらのモジュールとスクリプトのソースを考慮して、PowerShell ギャラリーから環境にコードを統合する前に注意してください。 分離されたテスト環境で PowerShell ギャラリーからのダウンロードを確認してテストします。 このプロセスにより、コードが安全で信頼性が高く、期待どおりに動作し、未確認のコードから生じる潜在的な問題や脆弱性から環境を保護します。

多くの組織は、独自の内部のプライベート NuGet リポジトリを確立することを選択します。 このリポジトリは、2 つの目的を果たします。 まず、社内で開発されたモジュールを格納するための安全な場所として機能し、内部使用のみを目的としています。 第 2 に、パブリック リポジトリからのモジュールを含め、外部からソース化されたモジュールの検証済みコレクションを提供します。 企業は通常、これらの外部モジュールを内部リポジトリに追加する前に、徹底的な検証プロセスを実行します。 このプロセスは、モジュールが悪意のあるコンテンツから解放され、会社のセキュリティおよび運用標準に準拠していることを確認するために重要です。

Find-Module モジュールの一部である コマンドレットを使用して、MrToolkit という名前のモジュールを PowerShell ギャラリーで見つけます。

Find-Module -Name MrToolkit
NuGet provider is required to continue
PowerShellGet requires NuGet provider version '2.8.5.201' or newer to
interact with NuGet-based repositories. The NuGet provider must be available
 in 'C:\Program Files\PackageManagement\ProviderAssemblies' or
'C:\Users\mikefrobbins\AppData\Local\PackageManagement\ProviderAssemblies'.
You can also install the NuGet provider by running 'Install-PackageProvider
-Name NuGet -MinimumVersion 2.8.5.201 -Force'. Do you want PowerShellGet to
install and import the NuGet provider now?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"):

Version    Name                      Repository        Description
-------    ----                      ----------        -----------
1.3        MrToolkit                 PSGallery         Misc PowerShell Tools

PowerShellGet モジュールのいずれかのコマンドを初めて使用すると、NuGet プロバイダーをインストールするように求められます。

MrToolkit モジュールをインストールするには、前のコマンドをパイプしてInstall-Moduleします。

Find-Module -Name MrToolkit | Install-Module -Scope CurrentUser
Untrusted repository
You are installing the modules from an untrusted repository. If you trust
this repository, change its InstallationPolicy value by running the
Set-PSRepository cmdlet. Are you sure you want to install the modules from
'https://www.powershellgallery.com/api/v2'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "N"):y

PowerShell ギャラリーは信頼されていないリポジトリであるため、モジュールのインストールを承認するように求められます。

パイプライン入力を簡単な方法で見つける

MrToolkit モジュールには、Get-MrPipelineInputという名前の関数が含まれています。 このコマンドレットは、パイプライン入力を受け入れることができるコマンドのパラメーターを識別するための便利な方法をユーザーに提供するように設計されています。 具体的には、次の 3 つの重要な側面が明らかになります。

  • パイプライン入力を受け取ることができるコマンドのパラメーター
  • 各パラメーターが受け入れるオブジェクトの型
  • 値またはプロパティ名でパイプライン入力受け入れるかどうか

この機能により、PowerShell コマンドのパイプライン機能を理解して利用するプロセスが大幅に簡略化されます。

ヘルプ ドキュメントを分析して以前に取得した情報は、この関数を使用して決定できます。

Get-MrPipelineInput -Name Stop-Service | Format-List
ParameterName                   : InputObject
ParameterType                   : System.ServiceProcess.ServiceController[]
ValueFromPipeline               : True
ValueFromPipelineByPropertyName : False

ParameterName                   : Name
ParameterType                   : System.String[]
ValueFromPipeline               : True
ValueFromPipelineByPropertyName : True

概要

この章では、PowerShell ワンライナーの複雑さについて学習しました。 また、コマンドの物理的な行数は、PowerShell ワンライナーとしての分類とは無関係であることを学習しました。 さらに、左側のフィルター処理、パイプライン、 PowerShellGet などの主要な概念について学習しました。

レビュー

  1. PowerShell ワンライナーとは何ですか?
  2. PowerShell で自然な改行が発生する可能性がある文字は何ですか?
  3. 左にフィルターを適用する必要がある理由
  4. PowerShell コマンドでパイプライン入力を受け入れる 2 つの方法は何ですか?
  5. PowerShell ギャラリーで見つかったコマンドを信頼すべきではないのはなぜですか?

リファレンス

次のステップ

次の章では、書式設定、エイリアス、プロバイダー、および比較演算子について説明します。