使用 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