43

次のコードはPSCustomObjectsの配列を提供しますが、文字列の配列を返すようにするにはどうすればよいですか?

$files = Get-ChildItem $directory -Recurse | Select-Object FullName | Where-Object {!($_.psiscontainer)}

(二次的な質問として、psiscontainerの部分は何のためにありますか?私はそれをオンラインの例からコピーしました)

承認後の編集: 2つのすばらしい答え、両方にマークを付けられたらいいのにと思います。元の回答を授与しました。

4

4 に答える 4

9

質問 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
型の "$_" という特別なパイプライン変数を介して、パイプラインを通過したオブジェクトを参照します。

于 2009-03-06T13:39:18.740 に答える
3

V1 の場合、次のフィルターをプロファイルに追加します。

filter Get-PropertyValue([string]$name) { $_.$name }

次に、これを行うことができます:

gci . -r | ?{!$_.psiscontainer} | Get-PropertyName fullname

ところで、PowerShell Community Extensionsを使用している場合は、既にこれを持っています。

V2 で Select-Object -Expand を使用する機能に関しては、これはかわいいトリックですが、明白ではなく、実際には Select-Object も -Expand も意図されたものではありません。-Expand は LINQ の SelectMany のように平坦化に関するものであり、Select-Object はカスタム オブジェクトへの複数のプロパティの射影に関するものです。

于 2009-03-22T06:45:41.607 に答える