【问题标题】:Use PowerShell to generate a list of files and directories使用 PowerShell 生成文件和目录列表
【发布时间】:2015-02-11 08:42:59
【问题描述】:

我正在编写一个 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?

【问题讨论】:

  • 喜欢 CMD 下的tree?您可以使用 Get-ChildItem 获取信息,并根据返回的项目将输出组织到主机。
  • 噢噢噢,树给了我目录结构。那很好啊!有没有办法把文件也放在那里,或者类似的东西?
  • Yes Tree /F 会做到的。
  • 还有来自PSCX的Show-Tree

标签: powershell powershell-2.0 get-childitem


【解决方案1】:

Windows 中,导航到感兴趣的目录

Shift+鼠标右键->Open PowerShell window here

Get-ChildItem | tree /f > tree.log

【讨论】:

    【解决方案2】:

    在您的特定情况下,您想要的是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 行。此外,如果 Keith Hill 在附近,他还会推荐包含 cmdlet Show-Tree 的 PowerShell 社区扩展 (PSCX)。如果您好奇,请从here 下载。那里有很多强大的东西。

    【讨论】:

    • 只是指出 $path 变量没有被 tree 命令使用。 Tree 将简单地查看它正在执行的当前目录。
    • @MagicAndi 它对我来说很好用。只要 $path 不为 null 或为空。可能是控制台中的错误导致了一个问题,因为我没有引用路径字符串
    • 抱歉,我的错误。我尝试使用 C:\ 作为路径,而不仅仅是 C:
    • Np。我确实会犯错。
    • Tree 似乎没有显示隐藏的文件/文件夹,也没有 /force 或类似的开关。有没有办法显示隐藏的文件/文件夹?
    【解决方案3】:

    对我来说最好最清晰的方法是:

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

    【讨论】:

      【解决方案4】:

      以下脚本将树显示为一个窗口,它可以添加到脚本中存在的任何表单中

      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是怎么回事?
      • 显示文件的文件夹位置
      【解决方案5】:

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

      【讨论】:

      • 这与“树”的作用相同,只是给了我目录结构。如何将文件添加到该树中?
      • 树会有输出,但它来自当前目录而不是<yourDir>
      • @Matt 我已经以这种方式进行了检查,并认为它在其他情况下也可以使用
      • 我尝试了“Get-ChildItem | tree”并得到了与“tree”相同的结果。我有 PowerShell 2.0
      猜你喜欢
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多