找到与字符串或部分字符串匹配的所有子目录

时间:2016-03-08 14:23:41

标签: powershell filesystems powershell-v2.0 get-childitem

我基本上需要在不知道完整路径的情况下将变量设置为文件夹路径。

我的问题是我需要找到一个名为" DirA"的目录。例如。但是这个目录可以位于" DirB \"或者" DirB \ DirC"有时它们可​​能包含的目录名称也不相同。

我知道目录路径的第一部分是相同的,所以我想在文件夹名称中使用-recurse过滤器,但有时我查找的目录没有被命名非常像通常预期的那个,有时候最后会有一个额外的字母。

是否有可能做某事......

$MyVariable = Get-ChildItem D:\Data\Dir1 -Recurse | Where-Object {$_.name -like "name"} -Directory |
% { $_.fullname }

非常感谢任何帮助!

5 个答案:

答案 0 :(得分:12)

尝试这样的事情:

$BaseDir = "C:\Dir1"
$NameToFind = "\DirA"

$MyVariable = Get-ChildItem $BaseDir -Recurse | Where-Object { $_.PSIsContainer -and $_.Name.EndsWith($NameToFind)}

这应该遍历树中的所有目录,从C:\ Dir1开始,并将目录对象DirA返回给你。

如果您只需要目录的路径,请使用:

$MyVariable.FullName

答案 1 :(得分:4)

您不需要使用Where-Object发布此处理。 -Filter已经可以为您提供此功能。如果您至少拥有PowerShell 3.0,则可以完整删除Where-object

(Get-ChildItem -Path D:\Data\Dir1 -Filter "*DirA*" -Recurse -Directory).Fullname

这将返回路径下具有确切名称DirA的所有目录。如果您需要部分匹配,那么只需使用简单的通配符:-Filter "Dir*some"

如果运行PowerShell 2.0,则可以执行以下操作。

Get-ChildItem -Path D:\Data\Dir1 -Filter "*DirA*" -Recurse | Where-Object {$_.PSIsContainer} | Select-Object -ExpandProperty Fullname

答案 2 :(得分:2)

您可以像使用Get-ChildItem一样使用recurse,只使用where-object来获取目录,然后使用名称过滤器。使用你试图找到DirA(但它后面可能有字母)的例子,它总是在Dir1里面,这个查询应该有效:

$MyVariable = Get-Childitem D:\Data\Dir1 -recurse | Where-Object {$_.PSIsContainer -and $_.name -like "*DirA*" | Select-Object -expandproperty fullname

答案 3 :(得分:2)

我会将此添加为评论,但是我的信誉点还不够……

dfundako的解决方案效果很好,只是缺少一个卷曲的尾括号。工作版本:

$MyVariable = Get-Childitem D:\Data\Dir1 -recurse | Where-Object {$_.PSIsContainer -and $_.name -like "*DirA*"} | Select-Object -expandproperty fullname

答案 4 :(得分:2)

您好,找到以下脚本,如果出现错误,它应该可以解决我的问题

$rootFolder = "D:\Data" ##Mention the root folder name here###

$folderItems = (Get-ChildItem $rootFolder) 

$subfolderslist = (Get-ChildItem $rootFolder -recurse | Where-Object {$_.PSIsContainer -eq $True -and $_.Name -like "*2018-08*"} | Sort-Object)

foreach ($curfolder in $subfolderslist)
{

    #Write-Host 'Folder Name '$curfolder  yyyy-mm-dd
    $subFolderItems = (Get-ChildItem $curfolder.FullName) 

    foreach($item in $subFolderItems)
    {

      $currentfile=$rootFolder+"\"+$curfolder+"\"+$item
      #Write-Host 'file path '$mfilepath
      Write-Host " "

     if ((Get-Item $currentfile ).length -gt 3mb)
      { 
        Write-Host "File size greater than 3 MB hence "$true
      }
      else 
       {
         Write-Host "File size less than 3 MB hence "$false
       }

    } 


}