用空格和制表符替换树命令的输出

Replace Output of Tree Command with Spaces and Tabs

所以我正在尝试解决一个问题,但我不知道这是否是解决问题的方法。

基本上我的文件夹结构如下所示:

\---folder
    \---subfolder1
        +---subsub1
        |   +---subsubsub1
        \---subsub2
            \---subsubsub2

我希望它在 excel 中看起来像这样: link to excel screenshot

我知道 Powershell 或命令提示符中的 tree 命令给出了上述文本输出,这就是我得到它的方式。我现在正在尝试格式化命令的输出,使其包含空格和制表符,而不是它所具有的 +、's、|'s 和 -'s。然后我可以将其导入 excel 以获得我在该屏幕截图中寻找的输出

在我的 PS 脚本中,我目前能够将 - 替换为空格,但 +、\ 和 |符号变成了不容易被替换的特殊字符。

有可能我正在努力完成的事情可以通过更简单的方法来完成,如果是这样,我愿意接受各种想法,但这就是我一直试图实现的方法。

这是我目前拥有的 Powershell 代码:

$filename = "test.txt"
tree /a > $filename
get-content $filename | %{$_ -replace "-"," "} 
get-content $filename | %{$_ -replace [RegEx]::Escape('< SharedPassKey=123456789abcdefghi/JKLM+nopqrst= />'),'< SharedPassKey=123456789abcdefghi/JKLM.nopqrst= />'}

到目前为止我 运行 关注的一些事情:

在我的评论中,使用 Export-CsvExport-Excel 时,列由对象属性定义。如果您要将前导 空格、斜线、竖线等 替换为 制表符 ,则导出为 CSV 或 Excel 后的最终结果将看起来不像您添加到问题中的电子表格,导出将是一个 one 列文件,每个单元格将有不同的填充(取决于文件的嵌套)。

在我看来,即使需要更多代码,也可以使用递归而不是 regex 替换。在这个例子中,我将使用我的 /etc/ 文件夹。

  • 所以,一步一步,定义一个递归函数来首先扫描目录:
function Get-FolderRecursive {
[cmdletbinding()]
param(
    [string]$Path,
    [int]$Nesting = 0,
    [switch]$Force
)
    
    $outObject = {
        param($Nesting, $folder)
        
        [pscustomobject]@{
            Nesting   = $Nesting
            Hierarchy = $folder.Name
        }
    }
    
    if(-not $Nesting)
    {
        $parent = Get-Item -LiteralPath $Path
        & $outObject -Nesting $Nesting -Folder $parent
    }

    $Nesting++

    $folders = if($Force.IsPresent)
    {
        Get-ChildItem -LiteralPath $Path -Directory -Force
    }
    else
    {
        Get-ChildItem -LiteralPath $Path -Directory
    }

    foreach($folder in $folders)
    {
        & $outObject -Nesting $Nesting -Folder $folder
        
        $PSBoundParameters.Path = $folder.FullName
        $PSBoundParameters.Nesting = $Nesting
        Get-FolderRecursive @PSBoundParameters
    }
}
  • 定义函数后,我们可以将结果存储在变量中:
PS /etc> $result = Get-FolderRecursive . -ErrorAction SilentlyContinue

这些是结果 object[] 的几行:

PS /etc> $result | Select-Object -First 10

Nesting Hierarchy
------- ---------
      0 etc
      1 acpi
      2 events
      1 alternatives
      1 apache2
      2 conf-available
      2 mods-available
      1 apm
      2 event.d
      2 resume.d
  • 现在我们已经将文件夹层次结构存储在一个变量中,我们可以操纵这个 object[] 以获得所需的输出,它与 Export-CsvExport-Excel 兼容:
$maxNesting = ($result.Nesting | Measure-Object -Maximum).Maximum

$output = foreach($item in $result)
{
    $out = [ordered]@{}
    foreach($z in 0..$maxNesting)
    {
        $out["Column $z"] = ''
    }
    $out["Column $($item.Nesting)"] = $item.Hierarchy
    [pscustomobject]$out
}
  • 如果我们检查 $output 的前几行,它是这样的:
PS /etc> $output | Format-Table -AutoSize
                          
Column 0 Column 1                   Column 2               Column 3                      Column 4
-------- --------                   --------               --------                      --------
etc                                                                                      
         acpi                                                                            
                                    events                                               
         alternatives                                                                    
         apache2                                                                         
                                    conf-available                                       
                                    mods-available                                       
         apm                                                                             
                                    event.d                                              
                                    resume.d                                             
                                    scripts.d                                            
                                    suspend.d                                            
         apparmor                                                                        
                                    init                                                 
                                                           network-interface-security    
         apparmor.d                                                                     

如果您有兴趣,我创建了一个使用此函数的修改版本的模块。除了文件夹大小之外,它还产生与 tree 相同的输出:PSTree.