用空格和制表符替换树命令的输出
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-Csv
或 Export-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-Csv
和 Export-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
.
所以我正在尝试解决一个问题,但我不知道这是否是解决问题的方法。
基本上我的文件夹结构如下所示:
\---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-Csv
或 Export-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-Csv
和Export-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
.