35

I'm writing a PowerShell script to make several directories and copy a bunch of files together to "compile" some technical documentation. I'd like to generate a manifest of the files and directories as part of the readme file, and I'd like PowerShell to do this, since I'm already working in PowerShell to do the "compiling".

I've done some searching already, and it seems that I need to use the cmdlet "Get-ChildItem", but it's giving me too much data, and I'm not clear on how to format and prune out what I don't want to get my desired results.

I would like an output similar to this:

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

or maybe something like this:

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

In other words, some kind of basic visual ASCII representation of the tree structure with the directory and file names and nothing else. I have seen programs that do this, but I am not sure if PowerShell can do this.

Can PowerShell do this? If so, would Get-ChildItem be the right cmdlet?

YetAnotherRandomUser
  • 1,217
  • 3
  • 13
  • 29
  • 2
    Like `tree` under CMD? You could get the info with Get-ChildItem and organise the output to the host depending on the items returned yes. – Micky Balladelli Dec 12 '14 at 15:42
  • 1
    Oooooo, tree gives me the directory structure. That would be great! Is there a way to get the files in there too, or something similar to that? – YetAnotherRandomUser Dec 12 '14 at 15:48
  • 2
    Yes Tree /F will do it. – Micky Balladelli Dec 12 '14 at 15:59
  • 1
    There is also Show-Tree from the [PSCX](http://blogs.technet.com/b/heyscriptingguy/archive/2010/07/09/hey-scripting-guy-tell-me-about-powershell-community-extensions.aspx) – Matt Dec 12 '14 at 16:06
  • possible duplicate of [How to save file structure to text file?](http://stackoverflow.com/questions/9569896/how-to-save-file-structure-to-text-file) – Matt Dec 12 '14 at 16:07
  • Tree /f does exactly I want to do, thanks a lot! How can I strip out the part at the front talking about the volume, serial number, and drive letter though? As far as a duplicate, in theory we have very similar goals, but I don't know about a duplicate. Also, that "Show-Tree" command doesn't work. I've determined that I have PowerShell 2.0 – YetAnotherRandomUser Dec 12 '14 at 16:22
  • Show-Tree is not a native cmdlet. Its part of the PowerShell Community Extenstions PSCX which I linked in my comment. – Matt Dec 12 '14 at 16:24

5 Answers5

52

In your particular case what you want is Tree /f. You have a comment asking how to strip out the part at the front talking about the volume, serial number, and drive letter. That is possible filtering the output before you send it to file.

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

Tree's output in the above example is a System.Array which we can manipulate. Select-Object -Skip 2 will remove the first 2 lines containing that data. Also, If Keith Hill was around he would also recommend the PowerShell Community Extensions(PSCX) that contain the cmdlet Show-Tree. Download from here if you are curious. Lots of powerful stuff there.

Matt
  • 42,566
  • 8
  • 67
  • 104
  • Just to point out that the $path variable is not used by the tree command. Tree will simply look at the current directory it is being executed from. – Tangiest Nov 16 '17 at 13:00
  • @MagicAndi It works for me just fine. As long as $path is not null or empty. Possibly an error in console caused an issue since I didnt quote the path string – Matt Nov 16 '17 at 13:02
  • 1
    apologies, my mistake. I tried to use C:\ for the path instead of just C: – Tangiest Nov 16 '17 at 13:32
  • 2
    Np. I do make mistakes. – Matt Nov 16 '17 at 13:33
  • Tree doesn't seem to show hidden files/folders, and doesn't seem to have a /force or similar switch. Is there any way to show hidden files/folders? – BeanBagKing Feb 05 '21 at 20:01
  • Does not appear to be a way no. Can't even find anything authoritative that specifically states this is normal behaviour – Matt Feb 08 '21 at 13:57
  • The capitalized "Tree" doesn't work on Linux, it's just "tree" – Nicholas Saunders Feb 22 '21 at 01:45
7

The following script will show the tree as a window, it can be added to any form present in the script

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
3

The best and clear way for me is:

PS P:\> Start-Transcript -path C:\structure.txt -Append
PS P:\> tree c:\test /F
PS P:\> Stop-Transcript
NIK
  • 869
  • 9
  • 17
3

In Windows, navigate to the directory of interest

Shift+ right click mouse -> Open PowerShell window here

Get-ChildItem | tree /f > tree.log
Roman
  • 15,278
  • 11
  • 75
  • 80
0

You can use command Get-ChildItem -Path <yourDir> | tree >> myfile.txt this will output tree-like structure of a directory and write it to "myfile.txt"

kravasb
  • 686
  • 5
  • 16