Powershell 获取文件夹名称之类的,并获取第一个子目录

Powershell getting foldername like, and get the first subdirectory

我已经有了从所有子目录中获取文件的脚本 但是我无法控制获取子目录的深度。 我的意思是,我的路径中有多个子目录。例如。 C:\SCRIPTS\testing\testfiles\rawfiles rawfiles下有子目录

  1. stuck_test
  2. raw_testfiles1-->stuck_test
  3. raw_testfiles2-->stuck_test
  4. raw_testfiles3-->stuck_test
  5. raw_testfiels4-->stuck_test

而我想要做的是让 stuck_test 不在 raw_testfiles1 目录中。但我不想指定路径。就像我想限制-recurse。 提前致谢。 我真的被困在这里了。

 cls

    $folderName = "stuck_test" 
    $pathtest = "C:\SCRIPTS\testing\testfiles\rawfiles"

    $gettest = Get-ChildItem -path $pathtest -filter $foldername -recurse| Select-Object -Expand FullName

    $path1 = $gettest

    $Allfiles = Get-Childitem -Path $path1 -recurse| Where {!$_.PSIsContainer}| Select-Object Fullname

    foreach ($file in $Allfiles)
        {       
           $file1 = $file.Fullname
           $foldername = Get-ChildItem -Path $file.Fullname
           $input = $foldername.Directoryname
           $Mothername = Get-Item -Path $input
           $output = $Mothername.Parent.Fullname
           $output = "$output\processed"
           Write-Host "The Filename: $file1"
           Write-Host "The FolderName: $input"

           $Getbase = (Get-Item $file1).BaseName
           Write-Host $Getbase

           "$file1" | Out-File -FilePath "C:\SCRIPTS\tester\LIST\stuck_files_list.txt" -Append


        }

您可以在 where-object 调用中使用 -notlike 排除文件夹。

如果您只想排除 raw_testfile1 中的 stuck_test 文件夹:

Get-ChildItem D:\testfolder -Recurse -Directory -Filter "stuck_test" | Where-Object {$_.FullName -notlike *rawr_testfile1\stuck_test'}

在我的测试场景中,我只在 raw_testfile2

中获得了 stuck_test 文件夹
D:\testfolder\stuck_test
D:\testfolder\rawr_testfile2\stuck_test

编辑:再次阅读你的标题我可能误解了你想做的事情,如果你想让所有子文件夹达到一定深度你可以使用\* 在你的 Get-ChildItem 路径中

获取初始文件夹和 1 个子文件夹的所有文件夹

$myPaths = @()
$mypaths += Get-ChildItem D:\testfolder\*,D:\testfolder\*\* | Select -ExpandProperty FullName

然后我们的 $myPaths 变量看起来像这样

D:\testfolder\rawr_testfile1
D:\testfolder\rawr_testfile2
D:\testfolder\stuck_test
D:\testfolder\rawr_testfile1\stuck_test
D:\testfolder\rawr_testfile2\stuck_test

这是一个函数,可以满足您的需求:

Function GCI-ToDepth{
Param(
    $Path = $PWD.Path,
    $Filter = "*",
    $Depth = 255
    )

    $Paths = 1..$Depth|ForEach{"{0}{1}" -f $Path.trimend('\'), ("\*" * $_)}
    Get-ChildItem -Path $Paths -Filter $Filter
}

它基于您可以对未知文件夹使用带 * 的 Get-ChildItem 的原则,因此您可以执行 Get-ChildItem C:\SCRIPTS\testing\testfiles\rawfiles\*\ 而这实际上与您想要为您提供所有文件中的文件相反这些子文件夹,但不是 rawfiles 文件夹本身。这个想法虽然扎实。根据您的需要,您可以 运行:

GCI-ToDepth -Path "C:\SCRIPTS\testing\" -Depth 3

这将为您提供指定文件夹中的文件,以及该文件夹的所有子文件夹及其子文件夹中的任何内容,但除此之外什么都没有。