使用 PowerShell 在每个子文件夹中创建文件列表
Create file list in every subfolder using PowerShell
我是 PowerShell 的新手,对 PowerShell 脚本的了解基本上为零,这就是我需要一些帮助的原因。
我有带子文件夹的文件夹结构(如下所示),我想使用 Get-ChildItem -Recurse
.
在每个第一级子文件夹中生成一个 filelist.txt
Main Folder
├───Sub 1
│ │ file.ext
│ └───Sub A
│ file.ext
└───Sub 2
| | file.ext
| └───Sub B
└─── etc.
到目前为止,我对网上找到的一些代码进行了试验,但要么出现错误,要么完全没有任何反应。这是最接近我想要的东西,因为它在正确的目录中创建 filelist.txt 文件,但不幸的是这些文件是空的。此外,在主文件夹中创建了一个我不想要的 filelist.txt。
Get-ChildItem -Recurse -Directory |
ForEach-Object {
New-Item -ItemType file -Path "$($_.FullName)" -Name "filelist.txt"
Get-ChildItem $_ -Recurse > filelist.txt
}
非常感谢任何帮助或建议!
虽然我通常会在使用 PowerShell cmdlet 找到合适的解决方案时避免使用外部命令,但 tree /f
已经为您做到了。有一些 可以提供目录树,但您应该能够毫无问题地手动将输出重定向到文件:
cd /path/to/base/folder
tree /f > filelist.txt
这将相对于您 运行 tree /f
所在的目录创建 filelist.txt
,并将输出重定向到 filelist.txt
。请注意,如果 filelist.txt
已存在于文件夹树中,它将与其余文件一起被枚举。
如果您正在寻找 Main Folder
的直接 sub-folders,您不应该在第一次调用 Get-ChildItem -Directory
时使用 -Recurse
,因为那样会给您全部sub-folders 正如 在他的有用评论中指出的那样递归。
关于您的出口线路:
Get-ChildItem $_ -Recurse > filelist.txt
它会将 filelist.txt
文件放在您的当前位置而不是子文件夹中,它还会在每次循环迭代时替换文件。
如果我正确理解您要查找的内容,代码将如下所示:
Get-ChildItem 'path\to\Main Folder' -Directory | ForEach-Object {
$destination = Join-Path $_.FullName -ChildPath filelist.txt
Get-ChildItem -LiteralPath $_.FullName -Recurse |
Set-Content $destination
}
值得注意的是,这只会导出 Main Folder
的每个 sub-folder 下的文件和文件夹的绝对路径,但是可能值得将导出类型更改为 CSV 以具有以下属性您在控制台上看到的每个对象:
$destination = Join-Path $_.FullName -ChildPath filelist.csv
Get-ChildItem -LiteralPath $_.FullName -Recurse |
Export-Csv $destination -NoTypeInformation
我想你想要的是:
Get-ChildItem -Path $BaseFolder -Depth 1
如果你需要另一个关卡,你可以乱用 -Depth 参数。
这是我所做的。
##variables
$startingLocation = Get-Location
$subs = Get-ChildItem -Recurse -Depth 1 -Directory
$startingCheck = ($startingLocation).Path + "\filelist.txt"
##create starting list in original directory
##check if it exists already and write to it
if ( Test-Path -Path $startingCheck) {
Get-ChildItem -Recurse >> filelist.txt
}
else {
Write-Warning "File doesn't exist... creating file."
New-Item -ItemType File -Path $startingLocation -Name "filelist.txt"
Write-Warning "File created."
Get-ChildItem -Recurse >> filelist.txt
Write-Warning "File created and now writing GCI to log."
}
##loop
foreach ($s in $subs) {
##go to the location
Set-Location -Path $s.FullName -Verbose
##test if output file exists in current directory of loop
$testPwd = Get-Location -Verbose
$currentPath = ($testPwd).Path + "\filelist.txt"
## if the file already exists - write GCI to it
if (Test-Path -Path $currentPath) {
Get-ChildItem -Recurse -Depth 1 >> filelist.txt
Write-Warning "File exists... writing GCI to log."
}
## otherwise if there is no file, make one and write GCI to it
else {
Write-Warning "File doesn't exist... creating file."
New-Item -ItemType File -Path $testPwd -Name "filelist.txt"
Write-Warning "File created."
Get-ChildItem -Recurse -Depth 1 >> filelist.txt
Write-Warning "File created and now writing GCI to log."
}
##exit the loop
}
#go back to original location
Set-Location $startingLocation
之前:
Folder PATH listing for volume Windows
Volume serial number is A4DB-B980
C:.
│ test.ps1
│
├───Folder1
│ │ doc1.txt
│ │ doc2.txt
│ │
│ ├───FolderA
│ └───FolderB
│ └───FolderB1
│ doc1b.txt
│ doc2b.txt
│
├───Folder2
│ ├───FolderA
│ └───FolderB
└───Folder3
结果:
Folder PATH listing for volume Windows
Volume serial number is A4DB-B980
C:.
│ filelist.txt
│ test.ps1
│
├───Folder1
│ │ doc1.txt
│ │ doc2.txt
│ │ filelist.txt
│ │
│ ├───FolderA
│ │ filelist.txt
│ │
│ └───FolderB
│ │ filelist.txt
│ │
│ └───FolderB1
│ doc1b.txt
│ doc2b.txt
│
├───Folder2
│ │ filelist.txt
│ │
│ ├───FolderA
│ │ filelist.txt
│ │
│ └───FolderB
│ filelist.txt
│
└───Folder3
filelist.txt
我是 PowerShell 的新手,对 PowerShell 脚本的了解基本上为零,这就是我需要一些帮助的原因。
我有带子文件夹的文件夹结构(如下所示),我想使用 Get-ChildItem -Recurse
.
Main Folder
├───Sub 1
│ │ file.ext
│ └───Sub A
│ file.ext
└───Sub 2
| | file.ext
| └───Sub B
└─── etc.
到目前为止,我对网上找到的一些代码进行了试验,但要么出现错误,要么完全没有任何反应。这是最接近我想要的东西,因为它在正确的目录中创建 filelist.txt 文件,但不幸的是这些文件是空的。此外,在主文件夹中创建了一个我不想要的 filelist.txt。
Get-ChildItem -Recurse -Directory |
ForEach-Object {
New-Item -ItemType file -Path "$($_.FullName)" -Name "filelist.txt"
Get-ChildItem $_ -Recurse > filelist.txt
}
非常感谢任何帮助或建议!
虽然我通常会在使用 PowerShell cmdlet 找到合适的解决方案时避免使用外部命令,但 tree /f
已经为您做到了。有一些
cd /path/to/base/folder
tree /f > filelist.txt
这将相对于您 运行 tree /f
所在的目录创建 filelist.txt
,并将输出重定向到 filelist.txt
。请注意,如果 filelist.txt
已存在于文件夹树中,它将与其余文件一起被枚举。
如果您正在寻找 Main Folder
的直接 sub-folders,您不应该在第一次调用 Get-ChildItem -Directory
时使用 -Recurse
,因为那样会给您全部sub-folders 正如
关于您的出口线路:
Get-ChildItem $_ -Recurse > filelist.txt
它会将 filelist.txt
文件放在您的当前位置而不是子文件夹中,它还会在每次循环迭代时替换文件。
如果我正确理解您要查找的内容,代码将如下所示:
Get-ChildItem 'path\to\Main Folder' -Directory | ForEach-Object {
$destination = Join-Path $_.FullName -ChildPath filelist.txt
Get-ChildItem -LiteralPath $_.FullName -Recurse |
Set-Content $destination
}
值得注意的是,这只会导出 Main Folder
的每个 sub-folder 下的文件和文件夹的绝对路径,但是可能值得将导出类型更改为 CSV 以具有以下属性您在控制台上看到的每个对象:
$destination = Join-Path $_.FullName -ChildPath filelist.csv
Get-ChildItem -LiteralPath $_.FullName -Recurse |
Export-Csv $destination -NoTypeInformation
我想你想要的是:
Get-ChildItem -Path $BaseFolder -Depth 1
如果你需要另一个关卡,你可以乱用 -Depth 参数。
这是我所做的。
##variables
$startingLocation = Get-Location
$subs = Get-ChildItem -Recurse -Depth 1 -Directory
$startingCheck = ($startingLocation).Path + "\filelist.txt"
##create starting list in original directory
##check if it exists already and write to it
if ( Test-Path -Path $startingCheck) {
Get-ChildItem -Recurse >> filelist.txt
}
else {
Write-Warning "File doesn't exist... creating file."
New-Item -ItemType File -Path $startingLocation -Name "filelist.txt"
Write-Warning "File created."
Get-ChildItem -Recurse >> filelist.txt
Write-Warning "File created and now writing GCI to log."
}
##loop
foreach ($s in $subs) {
##go to the location
Set-Location -Path $s.FullName -Verbose
##test if output file exists in current directory of loop
$testPwd = Get-Location -Verbose
$currentPath = ($testPwd).Path + "\filelist.txt"
## if the file already exists - write GCI to it
if (Test-Path -Path $currentPath) {
Get-ChildItem -Recurse -Depth 1 >> filelist.txt
Write-Warning "File exists... writing GCI to log."
}
## otherwise if there is no file, make one and write GCI to it
else {
Write-Warning "File doesn't exist... creating file."
New-Item -ItemType File -Path $testPwd -Name "filelist.txt"
Write-Warning "File created."
Get-ChildItem -Recurse -Depth 1 >> filelist.txt
Write-Warning "File created and now writing GCI to log."
}
##exit the loop
}
#go back to original location
Set-Location $startingLocation
之前:
Folder PATH listing for volume Windows
Volume serial number is A4DB-B980
C:.
│ test.ps1
│
├───Folder1
│ │ doc1.txt
│ │ doc2.txt
│ │
│ ├───FolderA
│ └───FolderB
│ └───FolderB1
│ doc1b.txt
│ doc2b.txt
│
├───Folder2
│ ├───FolderA
│ └───FolderB
└───Folder3
结果:
Folder PATH listing for volume Windows
Volume serial number is A4DB-B980
C:.
│ filelist.txt
│ test.ps1
│
├───Folder1
│ │ doc1.txt
│ │ doc2.txt
│ │ filelist.txt
│ │
│ ├───FolderA
│ │ filelist.txt
│ │
│ └───FolderB
│ │ filelist.txt
│ │
│ └───FolderB1
│ doc1b.txt
│ doc2b.txt
│
├───Folder2
│ │ filelist.txt
│ │
│ ├───FolderA
│ │ filelist.txt
│ │
│ └───FolderB
│ filelist.txt
│
└───Folder3
filelist.txt