web-dev-qa-db-ja.com

PowerShellを使用してファイルとディレクトリのリストを生成します

複数のディレクトリを作成し、いくつかのファイルを一緒にコピーして技術文書を「コンパイル」するためのPowerShellスクリプトを書いています。 readmeファイルの一部としてファイルとディレクトリのマニフェストを生成したいと思います。PowerShellで「コンパイル」を行うためにすでに作業しているので、PowerShellでこれを実行したいと思います。

既にいくつかの検索を実行しましたが、コマンドレット「Get-ChildItem」を使用する必要があるようですが、データが多すぎるため、フォーマットしない方法と不要なものを取り除く方法がわかりません希望する結果を取得したい。

次のような出力が必要です。

Directory
     file
     file
     file
Directory
     file
     file
     file
     Subdirectory
          file
          file
          file

または多分このようなもの:

+---FinGen
|   \---doc
+---testVBFilter
|   \---html
\---winzip

つまり、ある種の基本的な視覚的ASCIIディレクトリとファイル名を含むツリー構造の表現であり、他には何もありません。これを行うプログラムを見たことはありますが、PowerShellがこれを行う。

PowerShellはこれを実行できますか?もしそうなら、Get-ChildItemは正しいコマンドレットでしょうか?

20

あなたの特定の場合、あなたが望むのはTree /fです。ボリューム、シリアル番号、およびドライブ文字について話す前部の部品を取り除く方法を尋ねるコメントがあります。ファイルに送信する前に出力をフィルタリングすることが可能です。

$Path = "C:\temp"
Tree $Path /F | Select-Object -Skip 2 | Set-Content C:\temp\output.tkt

上記の例のツリーの出力は、操作可能なSystem.Arrayです。 Select-Object -Skip 2は、そのデータを含む最初の2行を削除します。また、キースヒルがいれば、コマンドレットShow-Treeを含むPowerShell Community Extensions(PSCX)もお勧めします。興味がある場合は、 here からダウンロードしてください。たくさんの強力なものがあります。

38
Matt

次のスクリプトは、ツリーをウィンドウとして表示します。スクリプトに存在する任意のフォームに追加できます

function tree {

   [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
   [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

   # create Window
   $Form = New-Object System.Windows.Forms.Form
   $Form.Text = "Files"
   $Form.Size = New-Object System.Drawing.Size(390, 390)
   # create Treeview-Object
   $TreeView = New-Object System.Windows.Forms.TreeView
   $TreeView.Location = New-Object System.Drawing.Point(48, 12)
   $TreeView.Size = New-Object System.Drawing.Size(290, 322)
   $Form.Controls.Add($TreeView)

   ###### Add Nodes to Treeview
   $rootnode = New-Object System.Windows.Forms.TreeNode
   $rootnode.text = "Root"
   $rootnode.name = "Root"
   [void]$TreeView.Nodes.Add($rootnode)

   #here i'm going to import the csv file into an array
   $array=@(Get-ChildItem -Path D:\personalWorkspace\node)
   Write-Host $array
   foreach ( $obj in $array ) {                                                                                                             
        Write-Host $obj
        $subnode = New-Object System.Windows.Forms.TreeNode
        $subnode.text = $obj
        [void]$rootnode.Nodes.Add($subnode)
     }

   # Show Form // this always needs to be at the bottom of the script!
   $Form.Add_Shown({$Form.Activate()})
   [void] $Form.ShowDialog()

   }
   tree

私にとって最良かつ明確な方法は次のとおりです。

PS P:\> Start-Transcript -path C:\structure.txt -Append
PS P:\> tree c:\test /F
PS P:\> Stop-Transcript
1
NIK