在 PS2 中制作自定义目录
Making a custom dirlisting in PS2
请考虑以下目录树:
root
dir1
dir11
x.L01 12kb
x.L02 10kb
dir12
dir122
a.jpg 5kb
b.xls 3kb
c.bmp 3kb
dir2
a.L01 100kb
a.L02 200kb
a.L03 50kb
dir3
dir31
dir4
有3种可能的情况:
- 一个(子)目录是空的;
root/dir3/dir31
和 root/dir4
- a (sub)dir 包含(仅)
L0x
个文件,其中 x
是一个数字; root/dir1/dir11
和 root/dir2
- 一个(子)目录有文件,但不是
L0x
类型的
所需的输出是包含 3 列的自定义目录列表:
- 文件路径
- 文件大小
- lefcount(见下文)
逻辑如下:
- 如果(子)目录为空,则不列出该目录
- 如果(子)目录包含(仅)
L0x
个文件,则只列出第一个(root/dir1/dir11/x.L01
)但 计算和所有 L01
s 的总文件大小
- 如果(子)目录有其他文件,列出目录,但是计算所有文件的数量和总文件大小
因此示例输出为:
path size count
----------------------------------------
root/dir1/dir11/x.L01 22kb 2
root/dir1/dir12/dir122 11kb 3
root/dir2/a.L01 350kb 3
我刚刚开始使用 powershell,并提出了以下内容,虽然内容不多,但 (a) 我的方向是否正确?以及 (b) 如何从这里开始?
Get-ChildItem "C:\root" -Recurse |
Foreach-Object {
If ($_.PSIsContainer) {
Get-ChildItem $_.fullname |
Foreach-Object {
Write-Host $_.fullname
}
}
}
如有任何帮助,我们将不胜感激!
这会随着您需求的变化而变化。这会将所需的输出创建为自定义对象,您可以根据需要对其进行操作和导出。
$rootPath = "c:\temp"
Get-ChildItem $rootPath -Recurse |
Where-Object {$_.PSIsContainer} |
Where-Object {(Get-ChildItem $_.FullName | Where-Object {!$_.PSIsContainer}| Measure-Object | Select-Object -ExpandProperty Count) -gt 0} |
ForEach-Object{
$files = Get-ChildItem $_.FullName
$props = @{
Path = $_.FullName
Size = "{0:N0} KB" -f (($files | Where-Object {!$_.PSIsContainer} | Measure-Object -Sum Length | Select-Object -ExpandProperty Sum) / 1024)
Count = $files | Measure-Object | Select-Object -ExpandProperty Count
}
If($files.Extension -match "L\d\d"){
# These are special files and we are assuming they are alone in the directory
# Change the path
$props.Path = $files | Where-Object {!$_.PSIsContainer} | Select-Object -First 1 | Select-Object -ExpandProperty FullName
}
New-Object -TypeName PSCustomObject -Property $props
} | Select Path,Size,Count
递归获取 $rootPath
的所有文件夹和文件。根据直接内容过滤掉所有文件和空文件夹。然后使用所有请求的详细信息构建一个自定义对象。如果发现存在 L0X 文件,则使用找到的第一个文件更新路径。
目前我假设所有文件都是 L0X 格式。如果需要我们可以确认。
示例输出
Path Size Count
---- ---- -----
C:\temp\win64 1,092 KB 2
C:\temp\Empy\Stuff\New Text Document - Copy.L01 0 KB 2
请考虑以下目录树:
root
dir1
dir11
x.L01 12kb
x.L02 10kb
dir12
dir122
a.jpg 5kb
b.xls 3kb
c.bmp 3kb
dir2
a.L01 100kb
a.L02 200kb
a.L03 50kb
dir3
dir31
dir4
有3种可能的情况:
- 一个(子)目录是空的;
root/dir3/dir31
和root/dir4
- a (sub)dir 包含(仅)
L0x
个文件,其中x
是一个数字;root/dir1/dir11
和root/dir2
- 一个(子)目录有文件,但不是
L0x
类型的
所需的输出是包含 3 列的自定义目录列表:
- 文件路径
- 文件大小
- lefcount(见下文)
逻辑如下:
- 如果(子)目录为空,则不列出该目录
- 如果(子)目录包含(仅)
L0x
个文件,则只列出第一个(root/dir1/dir11/x.L01
)但 计算和所有L01
s 的总文件大小
- 如果(子)目录有其他文件,列出目录,但是计算所有文件的数量和总文件大小
因此示例输出为:
path size count
----------------------------------------
root/dir1/dir11/x.L01 22kb 2
root/dir1/dir12/dir122 11kb 3
root/dir2/a.L01 350kb 3
我刚刚开始使用 powershell,并提出了以下内容,虽然内容不多,但 (a) 我的方向是否正确?以及 (b) 如何从这里开始?
Get-ChildItem "C:\root" -Recurse |
Foreach-Object {
If ($_.PSIsContainer) {
Get-ChildItem $_.fullname |
Foreach-Object {
Write-Host $_.fullname
}
}
}
如有任何帮助,我们将不胜感激!
这会随着您需求的变化而变化。这会将所需的输出创建为自定义对象,您可以根据需要对其进行操作和导出。
$rootPath = "c:\temp"
Get-ChildItem $rootPath -Recurse |
Where-Object {$_.PSIsContainer} |
Where-Object {(Get-ChildItem $_.FullName | Where-Object {!$_.PSIsContainer}| Measure-Object | Select-Object -ExpandProperty Count) -gt 0} |
ForEach-Object{
$files = Get-ChildItem $_.FullName
$props = @{
Path = $_.FullName
Size = "{0:N0} KB" -f (($files | Where-Object {!$_.PSIsContainer} | Measure-Object -Sum Length | Select-Object -ExpandProperty Sum) / 1024)
Count = $files | Measure-Object | Select-Object -ExpandProperty Count
}
If($files.Extension -match "L\d\d"){
# These are special files and we are assuming they are alone in the directory
# Change the path
$props.Path = $files | Where-Object {!$_.PSIsContainer} | Select-Object -First 1 | Select-Object -ExpandProperty FullName
}
New-Object -TypeName PSCustomObject -Property $props
} | Select Path,Size,Count
递归获取 $rootPath
的所有文件夹和文件。根据直接内容过滤掉所有文件和空文件夹。然后使用所有请求的详细信息构建一个自定义对象。如果发现存在 L0X 文件,则使用找到的第一个文件更新路径。
目前我假设所有文件都是 L0X 格式。如果需要我们可以确认。
示例输出
Path Size Count
---- ---- -----
C:\temp\win64 1,092 KB 2
C:\temp\Empy\Stuff\New Text Document - Copy.L01 0 KB 2