2016-06-27 3 views
1

파일 및 폴더의 권한을 가져오고 CSV 파일로 내보내려고합니다. 화면에 표시 할 정보를 얻을 수는 있지만 내보낼 때 결과 CSV 파일이 비어 있습니다. powershell에서 비어있는 CSV 파일을 내보낼 수 없습니다. 비어있는 CSV 파일

코드 :

function Test-IsWritable(){ 
<# 
    .Synopsis 
     Command tests if a file is present and writable. 
    .Description 
     Command to test if a file is writeable. Returns true if file can be opened for write access. 
    .Example 
     Test-IsWritable -path $foo 
     Test if file $foo is accesible for write access. 
    .Example 
     $bar | Test-IsWriteable 
     Test if each file object in $bar is accesible for write access. 
    .Parameter Path 
     Psobject containing the path or object of the file to test for write access. 
#> 
    [CmdletBinding()] 
    param([Parameter(Mandatory=$true,ValueFromPipeline=$true)][psobject]$path) 

    process{ 
     Write-Host "Test if file $path is writeable" 
     if (Test-Path -Path $path -PathType Any){ 
      $target = Get-Item $path -Force 
      try{  
       $writestream = $target.Openwrite() 
       $writestream.Close() | Out-Null   
       Remove-Variable -Name writestream 
       Write-Host "File is writable" -ForegroundColor DarkGreen 
       Write-Output $true 
       } 
      catch{    
       Write-Host "File is not writable" -ForegroundColor DarkRed 
       Write-Output $false 
       } 
      Remove-Variable -Name target 
     } 
     else{ 
      Write-Host "File $path does not exist or is a directory" -ForegroundColor Red 
      Write-Output $false 
     } 
    } 
} 

write-host "WARNING: If checking deep folders (where the full path is longer than 248 characters) please " -foregroundcolor Yellow -NoNewline 
Write-Host "MAP THE DRIVE " -ForegroundColor Red -NoNewline 
Write-Host "in order to keep the names as short as possible" -ForegroundColor Yellow 
$basefolder = Read-Host -Prompt 'What is the folder or files you want to get permissions of?' 

write-host "WARNING: if permissions.csv already exists, it will be overwritten!" -foregroundcolor Yellow 
Write-Host 'Export results to CSV? (y/n): ' -ForegroundColor Magenta -NoNewline 
$export = Read-Host 

if ($export -like "y") 
    { 
     Write-Host "Name the file (ex: permissions.csv): " -ForegroundColor Magenta -NoNewline 
     $FileName = Read-Host 

     $Outfile = “$PSScriptRoot\$FileName” 


     write-host "Will write results to $PSScriptRoot\$FileName" -ForegroundColor Green 
    } 

else 
    { 
     write-host "User did not type 'y', continuing" -ForegroundColor DarkYellow 
    } 



$files = get-childitem $basefolder -recurse -File 

Write-Host $files 
Write-Host "=========================" -ForegroundColor Black 

#$subfiles = Get-ChildItem $folders -Recurse -File 

#Write-Host $folders 
#Write-Host "=========================" -ForegroundColor Black 
#Write-Host $subfiles 


$results = foreach($folder in $files) { 


      New-Object psobject -Property @{ 
       File = $folder; 
       Access = "$basefolder\$folder" | Test-IsWritable 
      } 
      Write-Host $folder 

} 

#$subresults = foreach($subfile in $subfiles) { 


    #   New-Object psobject -Property @{ 
    #    File = $subfiles; 
    #    Access = $subfile | Test-IsWritable; 
    #   } 

#} 

Write-Host $results 
Write-Host "Finished combo loop, exporting..." -ForegroundColor Green 

$results | Export-Csv $Outfile -NoTypeInformation -Delimiter ";" 

Write-Host "Converting delimited CSV to Column Excel Spreadsheet" 
$outputXLSX = $PSScriptRoot + "\$Filename.xlsx" 
$excel = New-Object -ComObject excel.application 
$workbook = $excel.Workbooks.Add(1) 
$worksheet = $workbook.worksheets.Item(1) 
$TxtConnector = ("TEXT;" + $Outfile) 
$Connector = $worksheet.QueryTables.add($TxtConnector,$worksheet.Range("A1")) 
$query = $worksheet.QueryTables.item($Connector.name) 
$query.TextFileOtherDelimiter = ';' 
$query.TextFileParseType = 1 
$query.TextFileColumnDataTypes = ,2 * $worksheet.Cells.Columns.Count 
$query.AdjustColumnWidth = 1 
$query.Refresh() 
$query.Delete() 
$Workbook.SaveAs($outputXLSX,51) 
$excel.Quit() 

Remove-Item $Outfile 
Write-Host "See $PSScriptRoot\$Filename.xlsx for results" -ForegroundColor Green 

UPDATE :하지만 대부분 작업, 이상한 출력 :

Z : \ testfolder \은 File2.txt Z : \ testfolder \은 File2.txt Z : \ testfolder \은 file2.txt Z : \ testfolder \은 file2.txt Z : \ testfolder \은 file2.txt Z : \ testfolder \은 file2.txt Z : \ testfolder \은 file2.txt Z : \ testfolder \ file2.txt,Z : \ testfolder \ file2.txt Z : \ testfolder \ file2.txt Z : \ testfolder \ file2.txt Z : \ testfolder \ file2.txt Z : \ testfolder \ file2.txt Z : \ testfolder \ file2.txt Z : \ testfolder \ file3.rar Z : \ testfolder \ file3.rar Z : \ testfolder \ file3.rar Z : \ testfolder \ file3.rar Z : \ testfolder \ file3.rar Z : \ testfolder \ file3.rar Z : \ testfolder \ file3.rar 지정한 경로, 파일 이름 또는 둘 다 too 입니다. 정규화 된 파일 이름은 260 자 ( ) 미만이어야하며 디렉토리 이름은 248 자 미만이어야합니다. 다음 열에서

:

FileAccess FullControl FullControl 수정, ReadAndExecute 동기화 수정을 동기화, 수정을 동기화 FullControl, FullControl FullControl FullControl 수정, 동기화를 동기화 ... 사양 ified 경로, 파일 이름 또는 둘 다 너무 깁니다. 전체 파일 이름은 260 자 미만이어야하며 디렉토리 이름은 248 자 미만이어야합니다.

동일한 파일에 대해 여러 행이 표시되는 이유를 모르겠지만 실제 파일 액세스로 파일 당 1 행을 갖고 싶습니다.

답변

1

Export-Csv을 사용하기 전에 Write-Host을 제거하십시오. Write-Host은 파이프 라인에서 데이터를 소비하고 화면에 출력합니다.

#(...) 

$i = 0 

$results = foreach($acl in $acls) { 
    $folder = (Convert-Path $acl.pspath) 
    Write-Progress -Activity "Getting Security" -Status "checking $folder" -PercentComplete ($i/$folders.Count * 100) 

    foreach($access in $acl.GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier])) { 
     New-Object psobject -Property @{ 
      Folder = $folder; 
      User = $acl.Owner; 
      Group=$acl.Group; 
      Mode = $access.AccessControlType; 
      FileAcess = $access.FileSystemRights; 
     } 
    } 
    $i++ 
} 

Write-Host "Reached End, exporting..." -ForegroundColor Green 
$results | Export-Csv $Outfile -NoTypeInformation -Delimiter ";" 
+0

답변을 주셔서 감사합니다.하지만 실제로 CSV 파일을 반복적으로 대체하기 때문에 CSV에서 한 항목 만 가져옵니다. 지금은 잘 표시되지만 구분 기호가 내장되어 있지 않은'Add-Content'를 사용 중입니다. 어떤 아이디어? – Austin

+1

그래,이 문제를 해결하기 위해 내 대답을 편집했습니다. – sodawillow

+0

다시 한 번 고맙습니다. 위 코드를 조작하고 일부를 수정 했으므로 코드에 구분 된 CSV 파일로 만든 스프레드 시트가 있습니다. 하나의 마지막 질문은 파일과 폴더를 테스트 할 때 위에서 볼 수있는 것처럼 하나의 파일에 대해 여러 권한을 얻는 이유입니다. – Austin

관련 문제