【问题标题】:Powershell getting foldername like, and get the first subdirectoryPowershell获取文件夹名之类的,并获取第一个子目录
【发布时间】:2015-05-04 18:59:53
【问题描述】:

我已经有了从所有子目录中获取文件的脚本 但我无法控制获取子目录的深度。 我的意思是,我的路径中有多个子目录。例如。 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


        }

【问题讨论】:

    标签: powershell command-line scripting


    【解决方案1】:

    您可以通过在 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
    

    【讨论】:

      【解决方案2】:

      这里有一个函数可以满足你的需求:

      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
      

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

      【讨论】:

      • 在这个中,我可以控制路径的深度级别。但是如何显示或获取目录中的文件?我运行你的脚本,我所做的就是这样 GCI-ToDepth -Path "C:\SCRIPTS\testing\testfiles\rawfiles" -Depth 2 -filter "stuck_test"
      • 如果您不希望在 raw_testfiles 目录中使用stuck_test,深度将为 1,您可以将结果通过管道传送到 Get-ChildItem 以获取该文件夹中的文件。
      • 谢谢这位兄弟,我真的很感激。我现在找到了一种访问文件的新方法。谢谢各位
      猜你喜欢
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 2016-01-31
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多