質問 1 の場合
「select-object」部分を削除しました-冗長であり、dangphの回答とは異なり、「foreach」の前に「where」フィルターを移動しました-できるだけ早くフィルターして、次に対処する必要があるもののサブセットのみを処理しますパイプライン。
$files = Get-ChildItem $directory -Recurse | Where-Object {!$_.PsIsContainer} | foreach {$_.FullName}
そのコードスニペットは本質的に読み取ります
- すべてのファイルのフルパスを再帰的に取得 (Get-ChildItem $directory -Recurse)
- ディレクトリを除外する (Where-Object {!$_.PsIsContainer})
- 完全なファイル名のみを返す (foreach {$_.FullName})
- すべてのファイル名を $files に保存
foreach {$_.FullName}の場合、powershell では、スクリプト ブロック ({...}) の最後のステートメントが返されることに注意してください。この場合、型が文字列の $_.FullName
本当に生のオブジェクトを取得する必要がある場合は、「select-object」を削除した後は何もする必要はありません。Select-Object を使用するが生のオブジェクトにアクセスしたい場合は、"PsBase" を使用してください。これはまったく別の質問 (トピック)です。その主題
質問 2 の場合
また、!$_.PsIsContainerによるフィルタリングは、コンテナー レベルのオブジェクトを除外していることを意味します。この場合、FileSystem プロバイダーで Get-ChildItem を実行しているため (Get-PsProvider を介して PowerShell プロバイダーを表示できます)、コンテナーはDirectoryInfo (フォルダー)
PsIsContainerは、PowerShell プロバイダーごとに異なる意味を持ちます。例)レジストリプロバイダーの場合、PsIsContainer のタイプはMicrosoft.Win32.RegistryKey
です。
>pushd HKLM:\SOFTWARE
>ls | gm
[更新]次の質問へ: foreach は何をしますか? それは何を列挙していますか?
明確にするために、「foreach」は「Foreach-Object」のエイリアスです。
get-help foreach
- また -
get-alias foreach
私の答えでは、「foreach」は、前のパイプ(ディレクトリをフィルタリングした)から返された FileInfoタイプの各オブジェクトインスタンスを列挙しています。FileInfoにはFullNameというプロパティがあり、それが "foreach" が列挙しているものです。そして、"foreach" のスクリプト ブロック コンテキスト内でFileInfo
型の "$_" という特別なパイプライン変数を介して、パイプラインを通過したオブジェクトを参照します。