web-dev-qa-db-ja.com

文字列または文字列の一部に一致するすべてのサブディレクトリを見つける

基本的に、フルパスを知らなくても、変数をフォルダーパスに設定する必要があります。

私の問題は、たとえば「DirA」というディレクトリを見つける必要があることです。ただし、このディレクトリは「DirB \」または「DirB\DirC」にある可能性があり、それらが含まれる可能性のあるディレクトリ名は同じではない場合があります。

私はディレクトリパスの最初の部分が同じであることを知っているので、フォルダ名に-recurseフィルタを使用することを考えましたが、探しているディレクトリの名前が通常の名前と異なる場合があります予想通り、時には最後に追加の手紙があります。

次のようなことは可能でしょうか...

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

どんな助けでも大歓迎です!

7
Dewi Jones

このようなものを試してください:

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

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

これは、C:\ Dir1から始まるツリー内のすべてのディレクトリを通過し、ディレクトリオブジェクトDirAを返します。

ディレクトリのパスだけが必要な場合は、次のように使用します。

$MyVariable.FullName
17
Mark Oxley

これを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
5
Matt

Get-ChildItemを使用して、通常どおり再帰し、whereオブジェクトをスローしてディレクトリのみを取得し、名前フィルターを使用することもできます。常にDir1内のどこかにあるDirA(ただし、その後に文字が含まれている可能性があります)を検索する例を使用すると、次のクエリは機能します。

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

こんにちは、以下のスクリプトを見つけてください。間違っていた場合に備えて、正しく機能するはずです。

$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
       }

    } 


}
2
Murthy Veera

これはコメントとして追加したかったのですが、まだ評判ポイントが足りません...

dfundakoのソリューションは適切に機能し、1つの中括弧が欠落しています。作業バージョン:

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