Используйте PowerShell для создания списка файлов и каталогов

Я пишу PowerShell script, чтобы создать несколько каталогов и скопировать кучу файлов для "компиляции" некоторой технической документации. Я хотел бы создать манифест файлов и каталогов как часть файла 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 будет правильным командлетом?

Ответ 1

В вашем конкретном случае вы хотите 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 строки, содержащие эти данные. Кроме того, если бы Кейт Хилл был рядом, он также рекомендовал расширения сообщества PowerShell (PSCX), содержащие командлет Show-Tree. Скачайте с здесь, если вам интересно. Там много мощного материала.

Ответ 2

Следующий script покажет дерево как окно, его можно добавить в любую форму, представленную в 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
   [email protected](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

Самый лучший и понятный для меня способ:

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

Ответ 4

Вы можете использовать команду Get-ChildItem -Path <yourDir> | tree >> myfile.txt, которая выведет древовидную структуру каталога и запишет ее в файл "myfile.txt"

Ответ 5

В Windows перейдите в интересующий каталог

Shift + щелчок правой кнопкой мыши → Open PowerShell window here

Get-ChildItem | tree /f > tree.log