2014-07-08 2 views
0

이것은 정말 Powershell 101입니다.하지만 저는 갇혀 있습니다.Powershell 데이터를 문자열로 출력

폴더 트리를 반복하면서 각 하위 폴더 이름과 파일 수를 얻으려고합니다. 거기에 문제 없습니다. 새로운 요구 사항은 각 하위 폴더에서 ACL을 얻는 것입니다. 이 모든 데이터는 각 폴더 이름, 파일 수 및 CSV의 한 필드에있는 단일 문자열의 ACL (세미콜론으로 구분)을 사용하여 CSV 형식으로 출력해야합니다.

Excel에서 데이터를 볼 수 있다면 XML로 내보내기가 가능합니다.

내가 붙어있는 부분은 ACL 정보를 CSV에 대한 단일 문자열로 가져 오는 것입니다. 다음과 같이 각 디렉토리에

가져-ACL 데이터를 보여줍니다 (내가하고 있어요 Select 단지 우리가 관심있는 모든이다 IdentityReference를하고 FileSystemRights, 얻을) :

IdentityReference    FileSystemRights 
-----------------    ---------------- 
BUILTIN\Users  ReadAndExecute, Synchronize 
BUILTIN\Users      AppendData 
BUILTIN\Users      CreateFiles 

내가 좋아하는 것을

#filecount,folder,perms 
51,C:\temp,BUILTIN\Users:ReadAndExecute,Synchronize;BUILTIN\Users:AppendData... 

유사 하위 디렉토리 당 하나 개의 라인으로 포맷 출력 파일, 나는 그러나 그것은이 방법으로 제시하기 위해 노력 join의 어떤 종류를 얻을 수 없습니다. 구분 기호의 조합이 사용되는 것에 대해서는 신경 쓰지 않습니다 (다시 Excel에서 읽을 수 있어야 함).

스크립트는 다음과 같습니다. 출력 파일에는 가로 지르는 각 디렉토리에 데이터 행이 추가됩니다. 이것은 매우 효율적이지는 않겠지 만 프로세스가 모든 서버 메모리를 소비하는 것을 원하지는 않습니다. 내가 알 수없는 비트는 ###로 시작됩니다. 단일 라인으로 엉망이 폴더의 모든 ACE를 원하기 때문에

(Get-ChildItem C:\temp -recurse | Where-Object {$_.PSIsContainer -eq $True}) | foreach { 
    $a = ($_.GetFiles().Count) 
    $f = $_.FullName 
    $p = (get-acl $_.FullName).Access | select-object identityreference,filesystemrights 
    ### do something with $p?  
    Out-File -FilePath c:\outfile.csv -Append -InputObject $a`,$f`,###$p? 
} 

답변

0

는이 같은 필요합니다

Get-ChildItem 'C:\temp' -Recurse | ? { $_.PSIsContainer } | % { 
    # build a list of "trustee:permissions" pairs 
    $perms = (Get-Acl $_.FullName).Access | % { 
      "{0}:{1}" -f $_.IdentityReference, $_.FileSystemRights 
      } 

    New-Object -Type PSObject -Property @{ 
    'Filecount' = $_.GetFiles().Count 
    'Folder'  = $_.FullName 
    'Permissions' = $perms -join ';' # join the list to a single string 
    } 
} | Export-Csv 'c:\outfile.csv' -NoType 

루프는 일반적으로 낮은 성능을 보장 내부는 가능하면 피해야한다, 그래서 추가 반복 . 바깥 쪽 루프는 사용자 정의 객체의 목록을 작성한 다음 Export-Csv을 통해 한 번에 내보낼 수 있습니다.

+0

완벽하게 작동합니다. PowerShell 2.0에서 작업 중이기 때문에 새 PSObject를 만들지는 몰랐습니다. 나는 전체 메모리를 메모리로 읽고 Export-CSV를 통해 마지막으로 출력하는 것에 대해 여전히 염려하지만, 메모리 소비를 살펴볼 것입니다. – Trix

+0

@Trix : 파이프 라인은 객체가 루프에서 생성 될 때 'Export-Csv'로 객체를 공급해야하므로 과도한 메모리 부하는 예상하지 않습니다. –