使用PowerShell生成文件和目录列表。

40

我正在编写一个PowerShell脚本,以创建多个目录并将一堆文件一起复制以“编译”一些技术文档。 我想在自述文件的一部分中生成文件和目录清单,并且我希望PowerShell这样做,因为我已经在PowerShell中工作以执行“编译”。

我已经进行了一些搜索,似乎需要使用cmdlet “Get-ChildItem”,但它给出了太多数据,我不清楚如何格式化和修剪掉我不想要的内容以得到期望的结果。

我想要类似于这样的输出:

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

或者可能是这样:

+---FinGen
|   \---doc
+---testVBFilter
|   \---html
\---winzip
换句话说,就是树形结构的基本可视化ASCII表示,只包括目录和文件名,不包括其他任何信息。我见过一些能够实现这个功能的程序,但不确定PowerShell是否可以做到。
PowerShell能否实现这一点?如果可以,那么Get-ChildItem是否是正确的cmdlet?

2
喜欢在CMD下使用tree命令吗?你可以使用Get-ChildItem获取信息,并根据返回的项将输出组织到主机上。 - Micky Balladelli
1
哦哦哦,树形结构给了我目录结构。太好了!有没有办法获取其中的文件,或类似的东西? - YetAnotherRandomUser
2
是的,使用 Tree /F 命令可以实现。 - Micky Balladelli
1
还有来自PSCX的Show-Tree。 - Matt
可能是重复的问题:如何将文件结构保存到文本文件中? - Matt
显示剩余2条评论
5个回答

59
在您的特定情况下,您需要的是Tree /f。您有一个评论询问如何去除前面讲述卷标、序列号和驱动器字母部分的内容。可以通过在将其发送到文件之前过滤输出来实现。
$Path = "C:\temp"
Tree $Path /F | Select-Object -Skip 2 | Set-Content C:\temp\output.tkt

在上面的例子中,Tree的输出是一个我们可以操作的System.Array。使用Select-Object -Skip 2将删除包含该数据的前两行。此外,如果Keith Hill在身边,他还会推荐PowerShell社区扩展(PSCX),其中包含Show-Tree命令。如果你感兴趣,可以从这里下载。那里有很多强大的东西。

1
抱歉,我的错误。我尝试使用C:\作为路径,而不是只有C:。 - Tangiest
2
没错,我也会犯错误。 - Matt
树形结构似乎无法显示隐藏的文件/文件夹,并且似乎没有/force或类似的开关。有没有办法显示隐藏的文件/文件夹? - BeanBagKing
似乎没有任何方法。甚至找不到任何权威来源明确指出这是正常行为。 - Matt
大写的“Tree”在Linux上不起作用,只能使用“tree”。 - Nicholas Saunders
显示剩余2条评论

8
以下脚本将会以窗口的形式展示树形结构,它可以被添加到脚本中任何表单中。
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

本地路径 D:\personalWorkspace\node 是什么意思? - Adam
这是一个文件夹位置,其文件会被显示。 - Ananth Kumar Vasamsetti

7

在Windows中,导航到所需目录

Shift+右键单击鼠标 -> 在此处打开PowerShell窗口

Get-ChildItem | tree /f > tree.log

4
我认为最好且易于理解的方法是:
PS P:\> Start-Transcript -path C:\structure.txt -Append
PS P:\> tree c:\test /F
PS P:\> Stop-Transcript

0

您可以使用命令 Get-ChildItem -Path <yourDir> | tree >> myfile.txt,这将输出目录的树形结构并将其写入“myfile.txt”文件。


有什么与“tree”相同的功能,只提供目录结构。我该如何将文件添加到该树中? - YetAnotherRandomUser
树形结构将会有输出,但是它将来自于当前目录而不是 <yourDir> - Matt
@Matt 我已经检查过了,认为这种方法在其他情况下也会起作用。 - kravasb
4
我尝试了“Get-ChildItem | tree”并得到了与“tree”相同的结果。我正在使用PowerShell 2.0。 - YetAnotherRandomUser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接