作成 2012.03.20
更新 2012.11.23
PowerShell でフォルダの一覧を再帰的に取得する
コード
2012.03.20 現在、Get-ChildItem では、[DATA] folder name のように[と]の文字が使用されたフォルダが開けない。
なので、C# で記述する。
folder_tree.ps1
param($root_path=".\")

$provider = New-Object Microsoft.CSharp.CSharpCodeProvider
$params = New-Object System.CodeDom.Compiler.CompilerParameters
$params.GenerateInMemory = $True
$params.TreatWarningsAsErrors = $True
$refs = "System.dll","mscorlib.dll"
$params.ReferencedAssemblies.AddRange($refs)
$txtCode = '
using System;
using System.IO;

public class MyFileSystem {
  public string [] SubTree(string path){
    string [] list1 = null;
    string [] list2 = null;
    string [] list3 = null;
    try{
      list1 = Directory.GetFiles(path);
      list2 = Directory.GetDirectories(path);
      int fs = list1.Length;
      Array.Resize(ref list1, fs + list2.Length);
      list2.CopyTo(list1, fs);
      foreach(string elm in list2){
        DirectoryInfo di = new DirectoryInfo(elm);
        if((di.Attributes & FileAttributes.ReparsePoint)
		 == FileAttributes.ReparsePoint){ continue; }
        list3 = SubTree(elm);
        fs = list1.Length;
        Array.Resize(ref list1, fs + list3.Length);
        list3.CopyTo(list1, fs);
      }
    }catch(System.UnauthorizedAccessException uae){
      if(list1 == null){ Array.Resize(ref list1, 1); }
      list1[0] = uae.Message;
      Console.Write(uae.Message+"\n");
    }
    return list1;
  }
}
'
$results = $provider.CompileAssemblyFromSource($params, $txtCode)
$results.Errors
$mAssembly = $results.CompiledAssembly
$i = $mAssembly.CreateInstance("MyFileSystem")

if(-not (Test-Path $root_path)){
  Write-Host "指定されたパスが見つかりません。"
  Exit 1
}
if($root_path -match "^[a-zA-Z]:$"){ $root_path = $root_path+"\" }
$i.SubTree($root_path)
実行例
string[] のデータ型で取得できる。全部表示すると連続実行できなくなる場合があるので注意。
> $data = .\folder_tree.ps1 C:\
> $data.length
136494

©2004-2017 UPKEN IPv4