-2

編集者注:
この質問の要点は次のとおりです: *派生パス情報、つまり親フォルダー パス (asおよび名前 (as )) を含む
オブジェクト出力にカスタム プロパティを追加するにはどうすればよいですか? * 結果のオブジェクトをCSVファイル? Get-ChildItemFolderFoldername

現在、StackOverflow から取得し、自分で使用するために変更したスクリプトを実行しています。スクリプトの目的は、ディレクトリを調べてファイル名を取得し、.csv ファイルとしてディレクトリにエクスポートすることです。

スクリプトを変更して、ファイル名だけをプルすることpath, userができました。元々は,Name. なんらかの理由で、スクリプトが含まれている親フォルダーをプルするスクリプトを取得できず、親の親フォルダーも必要です。

コードのこの部分に最も問題があると思います。selectに追加できまし,Nameたが、追加,folderまたは,foldername後に正しくプルスルーselectしません。

ForEach-Object {$_ | Add-Member -Name "Owner" -MemberType NoteProperty -Value (Get-Acl $_.FullName).Owner -PassThru} | 
 Sort-Object fullname | 
  Select FullName,CreationTime,LastWriteTime,Owner,Name,Folder,Foldername
4

1 に答える 1

3

for files によって返される[System.IO.FileInfo]インスタンスには、またはプロパティGet-ChildItemがありません。FolderFolderName

Get-ChildItem -File $HOME\Desktop | Get-Memberたとえば、 は利用可能なプロパティを表示し、およびプロパティから必要な情報を取得できることを示します。PSPathPSParentPath

Select-Objectでは、ハッシュテーブルベースのプロパティ定義、いわゆる計算プロパティ使用できます。これにより、プロパティの名前変更変換、スクリプト ブロックを介して他のプロパティ値から派生したカスタム プロパティを追加できます。

注:また、およびコマンドレットで計算されたプロパティを使用して、Format-TableFormat-List表示専用の出力を作成することもできます(他のコマンドレットと同様に、リンクされたヘルプ トピックを参照してください)。

探しているものの簡単な例 (CSV ファイルへの出力を含む):

Get-ChildItem $HOME\Desktop | Select-Object Name,
  @{ Name = 'Folder'; Expression = { Convert-Path $_.PSParentPath } },
  @{ Name = 'Foldername'; Expression = { ($_.PSPath -split '\\')[-2] } } |
    Export-Csv Out.csv -Encoding Utf8 -NoTypeInformation

または、質問のプロパティで行ったように、を介して入力オブジェクトにプロパティをFolder追加することもできます。FolderNameAdd-MemberOwner

説明:

を実行すると、言及されたコマンドのいずれかに関するより詳細な情報を取得できることに注意してくださいGet-Help <command-name> -Full-onlineブラウザでヘルプ トピックを表示するために追加します。-split演算子の詳細については、実行してくださいGet-Help about_split。PowerShell のヘルプ システム全般について学習するには、 を実行しますGet-Help Get-Help -online

  • @{ ... }に渡される各コンストラクトは、各出力オブジェクトにアタッチするプロパティを定義するハッシュ テーブルですSelect-Object

    • ハッシュ テーブルには 2 つのエントリが必要です。
      • Name または Labelプロパティの名前を定義します。簡潔にするために、キー名の (大文字と小文字を区別しない) プレフィックスを使用できnますl
      • Expressionプロパティのを定義します。繰り返しますが、キー名の (大文字と小文字を区別しない) プレフィックスも機能しますe
        • 単純に入力プロパティの名前を変更したい場合は、式を単なるプロパティ(文字列) にすることもできますが、より一般的には、入力オブジェクトごとに実行されるコードの一部であるスクリプト ブロック( ) を使用します。出力は、定義されているプロパティの値になります。そのスクリプト ブロック内で、自動変数(または) は手元の入力オブジェクトを参照します。{ ... }$_$PSItem
  • プロパティの定義Folder: プロパティに含まConvert-Path $_.PSParentPathれる完全修飾 PowerShell パス (ドライブ プロバイダーを識別するプレフィックスを含む) を通常のファイルシステム パスに変換します。PSParentPath例: Microsoft.PowerShell.Core\FileSystem::C:\Users\jdoe\Desktop-> C:\Users\jdoe\Desktop.

  • Foldernameプロパティの定義 ($_.PSPath -split '\\')[-2]:フル パスをパス セパレーターによってコンポーネントに分割し、\最後から 2 番目のコンポーネント ( ) にアクセスし-2ます。これは親フォルダー名です。例C:\Users\jdoe\Desktop\file.txt- >Desktop

    • '\\'を表す\ために使用する必要があります。これ-splitは、 の最初の RHS オペランドが正規表現であるためです。ここに\は特別な意味があり、リテラルとして取得するには 2 倍にする必要があります。
    • /クロスプラットフォームのサポートのためにパスセパレーターとしてもサポートしたい場合は、($_.PSPath -split '[\\/]')[-2].
  • Export-CsvSelect-Objectによって出力されたオブジェクトを CSVにエクスポートしますOut.csv。入力オブジェクトのプロパティ名がヘッダー行になり、プロパティ値がデータ行になります。

    • -Encoding Utf8Windows PowerShellでのみ必要です (PowerShell (Core) 7+ は現在、幸いなことに一貫して BOM なしの UTF-8 を使用しています)、非 ASCII 文字が適切にエンコードされていることを保証します。デフォルトでExport-Csvは、ASCII エンコーディングを使用し、外国の文字などの非 ASCII 文字をそのまま ?の文字に置き換えるだけで、情報が失われます。-Encoding Utf8Windows PowerShellでは、必ずBOM 付きのUTF-8 ファイルが作成されることに注意してください。

    • -NoTypeInformation、これもWindows PowerShellでのみ必要です。デフォルトで出力ファイルの最初の行として追加される行を抑制します。この行にはExport-Csv、入力オブジェクトの完全な型名 (クラス名) が含まれます (たとえば、#TYPE System.Management.Automation.PSCustomObjectこれは、後の再変換を容易にするためのものです。オブジェクト)。

于 2016-10-04T21:18:17.047 に答える