2014-12-12 4 views
9

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

Как ' дерево' под CMD? Вы можете получить информацию с помощью Get-ChildItem и организовать вывод на хост в зависимости от возвращаемых элементов да. –

+1

Oooooo, дерево дает мне структуру каталогов. Это было бы прекрасно! Есть ли способ получить файлы там тоже, или что-то похожее на это? – YetAnotherRandomUser

+2

Да Дерево/F это сделает. –

ответ

25

В вашем конкретном случае, что вы хотите 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. Скачайте с here, если вам интересно. Там много мощного материала.

+0

Просто укажите, что переменная $ path не используется командой tree. Дерево будет просто смотреть на текущий каталог, из которого он выполняется. – MagicAndi

+0

@MagicAndi Это работает для меня просто отлично. Пока $ path не является нулевым или пустым. Возможно, ошибка в консоли вызвала проблему, так как я не процитировал строку пути – Matt

+0

извинения, моя ошибка. Я пытался использовать C: \ для пути, а не только для C: – MagicAndi

0

Вы можете использовать команду Get-ChildItem -Path <yourDir> | tree >> myfile.txt этот выход древовидную структуру каталога и записать его на «myfile.txt»

+0

То же самое, что и «tree», и дает мне структуру каталогов. Как добавить файлы в это дерево? – YetAnotherRandomUser

+2

@kravasb К сожалению, вы не можете подключиться к команде Tree –

+0

Дерево будет выводиться, но оно будет из текущего каталога, а не '' – Matt

2

Следующий сценарий покажет дерево в виде окна, он может быть добавлен в любой форме, присутствующей в сценарии

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 
0

Лучший и ясный путь для меня:

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