none
Export-csv объекта поля которого являются массивами RRS feed

  • Вопрос

  • И снова добрый день, коллеги.

    Новая проблема, есть объект с полями типа NotePropherty, некоторые из них являются массивами. Как мне  заставить Export-csv выводить значения этого массива в файле, а не тип System.Object[].

    Хочется чтобы было так

     

    User Path Permissions
    arr dir1,dir2,dir3 perm1,perm2,perm3

    А по факту это так (это результат команды $a | Export-Csv "c:\1.csv" -NoTypeInformation  -Delimiter ";")

    Уже как только не делал, не знаю как быть, хелп.)

    User Path Permissions
    arr System.Object[] System.Object[]
    19 июля 2011 г. 12:44

Ответы

  • Как вариант использовать select.
    PS 61 > Get-FsAcl arr @("dir1,dir2,dir3") @("perm1,perm2,perm3")
    
    User  Path  Permissions
    ----  ----  -----------
    arr  {dir1,dir2,dir3} {perm1,perm2,perm3}
    
    
    PS 62 > Get-FsAcl arr @("dir1,dir2,dir3") @("perm1,perm2,perm3") | select User,@{n="Path";e={$_.Path -join ","}},@{n="P
    ermissions";e={$_.Permissions -join ","}} | ConvertTo-Csv
    #TYPE Selected.System.Management.Automation.PSCustomObject
    "User","Path","Permissions"
    "arr","dir1,dir2,dir3","perm1,perm2,perm3"
    


    И преобразуем все назад:

     

    PS 66 > $result =Get-FsAcl arr @("dir1,dir2,dir3") @("perm1,perm2,perm3") | select User,@{n="Path";e={$_.Path -join ","
    }},@{n="Permissions";e={$_.Permissions -join ","}} | ConvertTo-Csv
    PS 67 > $result | ConvertFrom-Csv
    
    User   Path   Permissions
    ----   ----   -----------
    arr   dir1,dir2,dir3  perm1,perm2,perm3
    
    


    Ps. Я бы на вашем месте создал массив объектов с 1 элементом в свойствах,что гораздо удобнее и не имел проблем.

     

    $arr = @()
    $arr += Get-FsAcl arr "dir1" "perm1"
    $arr += Get-FsAcl arr "dir2" "perm2"
    $arr += Get-FsAcl arr "dir3" "perm3"
    
    
    PS 81 > $arr
    
    User     Path     Permissions
    ----     ----     -----------
    arr     dir1     perm1
    arr     dir2     perm2
    arr     dir3     perm3
    
    
    PS 82 > $arr | ConvertTo-Csv
    #TYPE System.Management.Automation.PSCustomObject
    "User","Path","Permissions"
    "arr","dir1","perm1"
    "arr","dir2","perm2"
    "arr","dir3","perm3"
    


     



    • Помечено в качестве ответа SteFFun 20 июля 2011 г. 8:02
    19 июля 2011 г. 12:56
    Отвечающий
  • 1) Видите впервые,потому что справку не читаете стандартную. 2) А какая разница,какая будет длина массива?
    $user = "user1", "user", "user3"
    $Path = "C:\Folder"
    
    
    $arr = @()
    $folders = Get-ChildItem $Path | Where {$_.PsIsContainer}
    $acl = $folders | get-acl 
    
    Function Get-FsAcl($u, $dir, $a){
    $fsacl = New-Object PSobject
    $fsacl|Add-Member NoteProperty User -Value $u
    $fsacl|Add-Member NoteProperty Path -Value $dir
    $fsacl|Add-Member NoteProperty Permissions -Value $a
    $fsacl}
    
    foreach($u in $user){
     foreach($a in $acl){
     
     foreach($a1 in $a.access){
      
      if($a1.IdentityReference -match $u)
    	{
    	 $arr += get-FsAcl $a1.IdentityReference.Value (gi $a.path).fullname $a1.FileSystemRights
      }
      }
     }
    }
    $arr | Export-Csv "c:\1.csv" -NoTypeInformation -Delimiter ";"
    ii c:\1.csv 
    

    Вывод будет,для примера возьмем:

     

    PS 1 > $user = "Администратор", "система", "user3"
    PS 2 > $Path = "F:\my"
    PS 3 >
    PS 3 >
    PS 3 > $arr = @()
    PS 4 > $folders = Get-ChildItem $Path | Where {$_.PsIsContainer}
    PS 5 > $acl = $folders | get-acl
    PS 6 >
    PS 6 > Function Get-FsAcl($u, $dir, $a){
    >> $fsacl = New-Object PSobject
    >> $fsacl|Add-Member NoteProperty User -Value $u
    >> $fsacl|Add-Member NoteProperty Path -Value $dir
    >> $fsacl|Add-Member NoteProperty Permissions -Value $a
    >> $fsacl}
    >>
    PS 7 > foreach($u in $user){
    >>  foreach($a in $acl){
    >>
    >>  foreach($a1 in $a.access){
    >>
    >>   if($a1.IdentityReference -match $u)
    >>   {
    >>    $arr += get-FsAcl $a1.IdentityReference.Value (gi $a.path).fullname $a1.FileSystemRights
    >>   }
    >>  }
    >>  }
    >> }
    >> $arr | ConvertTo-Csv -Delimiter ";"
    >>
    #TYPE System.Management.Automation.PSCustomObject
    "User";"Path";"Permissions"
    "BUILTIN\Администраторы";"F:\my\Books";"FullControl"
    "BUILTIN\Администраторы";"F:\my\Books";"268435456"
    "BUILTIN\Администраторы";"F:\my\distr";"FullControl"
    "BUILTIN\Администраторы";"F:\my\distr";"268435456"
    "BUILTIN\Администраторы";"F:\my\OS";"FullControl"
    "BUILTIN\Администраторы";"F:\my\OS";"268435456"
    "BUILTIN\Администраторы";"F:\my\pssafe";"FullControl"
    "BUILTIN\Администраторы";"F:\my\pssafe";"268435456"
    "NT AUTHORITY\система";"F:\my\Books";"FullControl"
    "NT AUTHORITY\система";"F:\my\Books";"268435456"
    "NT AUTHORITY\система";"F:\my\distr";"FullControl"
    "NT AUTHORITY\система";"F:\my\distr";"268435456"
    "NT AUTHORITY\система";"F:\my\OS";"FullControl"
    "NT AUTHORITY\система";"F:\my\OS";"268435456"
    "NT AUTHORITY\система";"F:\my\pssafe";"FullControl"
    "NT AUTHORITY\система";"F:\my\pssafe";"268435456"
    


     

    • Помечено в качестве ответа SteFFun 20 июля 2011 г. 8:02
    20 июля 2011 г. 6:35
    Отвечающий
  • тут да, в создаваемом файле командой $arr | Export-Csv "c:\1.csv" -Encoding unicode -NoTypeInformation -Delimiter ";"

    SPB-TELEPORT\user1;"\\fs\teleport\AXE\TermClient";"ReadAndExecute, Synchronize"

     

    вписывает все в одну ячейку, а должен в три, соответственно

    SPB-TELEPORT\user1             \\fs\teleport\AXE\TermClient            ReadAndExecute, Synchronize           

    Смешно конечно,сами задаете разделитель ";",а хотите получить табулятор.Так и ставьте тогда -Delimeter "`t".Если просматриваете в Excel,то в системе какой у вас разделитель стоит?

    Использовать: Export-Csv -UseCulture "c:\1.csv" -Encoding unicode -NoTypeInformation

     

    • Помечено в качестве ответа SteFFun 20 июля 2011 г. 12:18
    20 июля 2011 г. 12:15
    Отвечающий

Все ответы

  • Как вариант использовать select.
    PS 61 > Get-FsAcl arr @("dir1,dir2,dir3") @("perm1,perm2,perm3")
    
    User  Path  Permissions
    ----  ----  -----------
    arr  {dir1,dir2,dir3} {perm1,perm2,perm3}
    
    
    PS 62 > Get-FsAcl arr @("dir1,dir2,dir3") @("perm1,perm2,perm3") | select User,@{n="Path";e={$_.Path -join ","}},@{n="P
    ermissions";e={$_.Permissions -join ","}} | ConvertTo-Csv
    #TYPE Selected.System.Management.Automation.PSCustomObject
    "User","Path","Permissions"
    "arr","dir1,dir2,dir3","perm1,perm2,perm3"
    


    И преобразуем все назад:

     

    PS 66 > $result =Get-FsAcl arr @("dir1,dir2,dir3") @("perm1,perm2,perm3") | select User,@{n="Path";e={$_.Path -join ","
    }},@{n="Permissions";e={$_.Permissions -join ","}} | ConvertTo-Csv
    PS 67 > $result | ConvertFrom-Csv
    
    User   Path   Permissions
    ----   ----   -----------
    arr   dir1,dir2,dir3  perm1,perm2,perm3
    
    


    Ps. Я бы на вашем месте создал массив объектов с 1 элементом в свойствах,что гораздо удобнее и не имел проблем.

     

    $arr = @()
    $arr += Get-FsAcl arr "dir1" "perm1"
    $arr += Get-FsAcl arr "dir2" "perm2"
    $arr += Get-FsAcl arr "dir3" "perm3"
    
    
    PS 81 > $arr
    
    User     Path     Permissions
    ----     ----     -----------
    arr     dir1     perm1
    arr     dir2     perm2
    arr     dir3     perm3
    
    
    PS 82 > $arr | ConvertTo-Csv
    #TYPE System.Management.Automation.PSCustomObject
    "User","Path","Permissions"
    "arr","dir1","perm1"
    "arr","dir2","perm2"
    "arr","dir3","perm3"
    


     



    • Помечено в качестве ответа SteFFun 20 июля 2011 г. 8:02
    19 июля 2011 г. 12:56
    Отвечающий
  • select User,@{n="Path";e={$_.Path -join ","
    }},@{n="Permissions";e={$_.Permissions -join ","}} Можете пояснить что значит это строка, впервые такое вижу...

    а если я заранее не знаю длину массива? то как эта запись будет выглядеть?
    $result =Get-FsAcl arr @("dir1,dir2,dir3") @("perm1,perm2,perm3")


    Ps. Я бы на вашем месте создал массив объектов с 1 элементом в свойствах,что гораздо удобнее и не имел проблем.

     

    $arr = @()  

    $arr += Get-FsAcl arr "dir1" "perm1"

    $arr += Get-FsAcl arr "dir2" "perm2"

    $arr += Get-FsAcl arr "dir3" "perm3"

     

    тоже не понял, в общем как Вы догадались, я хочу сделать скрипт который бы извлекал acl списки из заданных папок и потом в виде
    User Path Permissions
    user1 dir1 perm1
    dir2 perm2
    dir3 perm3
    User2 dir4 perm4
    dir5 perm5
    dir6 perm6
    dir7 perm7
    dir8 perm8
    user3 dir9 perm9
    dir10 perm10
    сохранял в csv файле, приведу текст своего скрипта

    $user = "user1", "user2", "user3"
    $Path = "C:\dir\*"


    $arr = @()
    $folders = Get-Item $Path
    $acl = get-acl $folders
    Function Get-FsAcl($u, $dir, $a){
    $fsacl = New-Object PSobject
    $fsacl|Add-Member NoteProperty User -Value $u
    $fsacl|Add-Member NoteProperty Path -Value $dir
    $fsacl|Add-Member NoteProperty Permissions -Value $a
    $fsacl}
    foreach($u in $user){

    $dir_arr = @()
    $perm_arr = @()

    foreach($a in $acl){

    foreach($a1 in $a.access){

    if($a1.IdentityReference -match $u){

    $user_acl = $a1.IdentityReference.ToString()
    $dir_arr += $a.path
    $perm_arr += $a1.FileSystemRights

    }


    }


    }

    $arr += get-FsAcl $user_acl $dir_arr $perm_arr
    }
    $arr | Export-Csv "c:\1.csv" -NoTypeInformation -Delimiter ";"; ii c:\1.csv

    все работает, но не могу настроить правильный вывод в csv файл...
    20 июля 2011 г. 5:18
  • 1) Видите впервые,потому что справку не читаете стандартную. 2) А какая разница,какая будет длина массива?
    $user = "user1", "user", "user3"
    $Path = "C:\Folder"
    
    
    $arr = @()
    $folders = Get-ChildItem $Path | Where {$_.PsIsContainer}
    $acl = $folders | get-acl 
    
    Function Get-FsAcl($u, $dir, $a){
    $fsacl = New-Object PSobject
    $fsacl|Add-Member NoteProperty User -Value $u
    $fsacl|Add-Member NoteProperty Path -Value $dir
    $fsacl|Add-Member NoteProperty Permissions -Value $a
    $fsacl}
    
    foreach($u in $user){
     foreach($a in $acl){
     
     foreach($a1 in $a.access){
      
      if($a1.IdentityReference -match $u)
    	{
    	 $arr += get-FsAcl $a1.IdentityReference.Value (gi $a.path).fullname $a1.FileSystemRights
      }
      }
     }
    }
    $arr | Export-Csv "c:\1.csv" -NoTypeInformation -Delimiter ";"
    ii c:\1.csv 
    

    Вывод будет,для примера возьмем:

     

    PS 1 > $user = "Администратор", "система", "user3"
    PS 2 > $Path = "F:\my"
    PS 3 >
    PS 3 >
    PS 3 > $arr = @()
    PS 4 > $folders = Get-ChildItem $Path | Where {$_.PsIsContainer}
    PS 5 > $acl = $folders | get-acl
    PS 6 >
    PS 6 > Function Get-FsAcl($u, $dir, $a){
    >> $fsacl = New-Object PSobject
    >> $fsacl|Add-Member NoteProperty User -Value $u
    >> $fsacl|Add-Member NoteProperty Path -Value $dir
    >> $fsacl|Add-Member NoteProperty Permissions -Value $a
    >> $fsacl}
    >>
    PS 7 > foreach($u in $user){
    >>  foreach($a in $acl){
    >>
    >>  foreach($a1 in $a.access){
    >>
    >>   if($a1.IdentityReference -match $u)
    >>   {
    >>    $arr += get-FsAcl $a1.IdentityReference.Value (gi $a.path).fullname $a1.FileSystemRights
    >>   }
    >>  }
    >>  }
    >> }
    >> $arr | ConvertTo-Csv -Delimiter ";"
    >>
    #TYPE System.Management.Automation.PSCustomObject
    "User";"Path";"Permissions"
    "BUILTIN\Администраторы";"F:\my\Books";"FullControl"
    "BUILTIN\Администраторы";"F:\my\Books";"268435456"
    "BUILTIN\Администраторы";"F:\my\distr";"FullControl"
    "BUILTIN\Администраторы";"F:\my\distr";"268435456"
    "BUILTIN\Администраторы";"F:\my\OS";"FullControl"
    "BUILTIN\Администраторы";"F:\my\OS";"268435456"
    "BUILTIN\Администраторы";"F:\my\pssafe";"FullControl"
    "BUILTIN\Администраторы";"F:\my\pssafe";"268435456"
    "NT AUTHORITY\система";"F:\my\Books";"FullControl"
    "NT AUTHORITY\система";"F:\my\Books";"268435456"
    "NT AUTHORITY\система";"F:\my\distr";"FullControl"
    "NT AUTHORITY\система";"F:\my\distr";"268435456"
    "NT AUTHORITY\система";"F:\my\OS";"FullControl"
    "NT AUTHORITY\система";"F:\my\OS";"268435456"
    "NT AUTHORITY\система";"F:\my\pssafe";"FullControl"
    "NT AUTHORITY\система";"F:\my\pssafe";"268435456"
    


     

    • Помечено в качестве ответа SteFFun 20 июля 2011 г. 8:02
    20 июля 2011 г. 6:35
    Отвечающий
  • да, все работает, один момент остался, так как есть русскоязычные пользователи приходится назначать кодировку unicode при экспрте в csv, но при этом перестает работать разделитель и он вписывает все в одну строку, как с этим быть?
    20 июля 2011 г. 8:01
  • да, все работает, один момент остался, так как есть русскоязычные пользователи приходится назначать кодировку unicode при экспрте в csv, но при этом перестает работать разделитель и он вписывает все в одну строку, как с этим быть?

    Думаю,что вы не указываете разделитель,при импорте.

    Import-Csv C:\1.csv -Delimeter ";"


    20 июля 2011 г. 8:09
    Отвечающий
  • Стоп, при каком импорте? Я же экспортирую в файл, при чем тут импорт?
    20 июля 2011 г. 8:54
  • Стоп, при каком импорте? Я же экспортирую в файл, при чем тут импорт?
    Вывод (gc 1.csv)[0..2] - покажите?
    20 июля 2011 г. 8:57
    Отвечающий
  • "User";"Path";"Permissions"
    "SPB-TELEPORT\user1";"\\fs\teleport\AXE\TermClient";"ReadAndExecute, Synchronize"
    "SPB-TELEPORT\user1";"\\fs\teleport\AXE\tmp";"ReadAndExecute, Synchronize"
    20 июля 2011 г. 11:43
  • "User";"Path";"Permissions"
    "SPB-TELEPORT\user1";"\\fs\teleport\AXE\TermClient";"ReadAndExecute, Synchronize"
    "SPB-TELEPORT\user1";"\\fs\teleport\AXE\tmp";"ReadAndExecute, Synchronize"
    Все в порядке,в чем проблема? 
    20 июля 2011 г. 11:56
    Отвечающий
  • тут да, в создаваемом файле командой $arr | Export-Csv "c:\1.csv" -Encoding unicode -NoTypeInformation -Delimiter ";"

    SPB-TELEPORT\user1;"\\fs\teleport\AXE\TermClient";"ReadAndExecute, Synchronize"

     

    вписывает все в одну ячейку, а должен в три, соответственно

    SPB-TELEPORT\user1             \\fs\teleport\AXE\TermClient            ReadAndExecute, Synchronize           

    20 июля 2011 г. 12:10
  • тут да, в создаваемом файле командой $arr | Export-Csv "c:\1.csv" -Encoding unicode -NoTypeInformation -Delimiter ";"

    SPB-TELEPORT\user1;"\\fs\teleport\AXE\TermClient";"ReadAndExecute, Synchronize"

     

    вписывает все в одну ячейку, а должен в три, соответственно

    SPB-TELEPORT\user1             \\fs\teleport\AXE\TermClient            ReadAndExecute, Synchronize           

    Смешно конечно,сами задаете разделитель ";",а хотите получить табулятор.Так и ставьте тогда -Delimeter "`t".Если просматриваете в Excel,то в системе какой у вас разделитель стоит?

    Использовать: Export-Csv -UseCulture "c:\1.csv" -Encoding unicode -NoTypeInformation

     

    • Помечено в качестве ответа SteFFun 20 июля 2011 г. 12:18
    20 июля 2011 г. 12:15
    Отвечающий
  • ну вот, смешно то смешно, однако если экспортировать без параметра -Encoding с разделителем ";" то он разделяет по ячейкам, где логика, а за помощь огромное спасибо!
    20 июля 2011 г. 12:18