이것은 정말 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?
}
완벽하게 작동합니다. PowerShell 2.0에서 작업 중이기 때문에 새 PSObject를 만들지는 몰랐습니다. 나는 전체 메모리를 메모리로 읽고 Export-CSV를 통해 마지막으로 출력하는 것에 대해 여전히 염려하지만, 메모리 소비를 살펴볼 것입니다. – Trix
@Trix : 파이프 라인은 객체가 루프에서 생성 될 때 'Export-Csv'로 객체를 공급해야하므로 과도한 메모리 부하는 예상하지 않습니다. –