none
Powershell - Скрипт по парсингу csv, получению данных из AD и удалению букв "MB" RRS feed

  • Вопрос

  • Добрый день!

    Есть файл csv такого вида:

    Name;Size;Allocated;Files;Folders;% of Parent;Last Change;Last Access;Owner
    ShkilevDA;383656,2 MB;383900,5 MB;120345;16215;8,1%;08.02.2017;09.02.2017;AytanovZK
    IlyinOV;304185,1 MB;304483,1 MB;151582;19397;6,4%;12.07.2017;12.07.2017;DubakSG
    GertsevDA;202011,6 MB;202092,1 MB;41830;2376;4,3%;12.07.2017;12.07.2017;IvanovAA01
    KitaevEE;184178,6 MB;184425,1 MB;128169;10381;3,9%;12.07.2017;11.07.2017;PirumovNR

    Необходимо из столбца Name (в нём логины пользователей AD) получить данные по пользователям из AD, а именно вывод Description и samaccountname. Я сделал скрипт такого вида:

     
    cls
    $a=""
    $m=@()
    $login = ""
    $t = ""
    
    $a = Get-Content -Path C:\Scripts\files\personal_12-07-2017.csv # -Encoding Unicode
    foreach ($b in $a){
        $m = $b.split(";")
        $login = $m[0]
        $r = Get-ADUser -Identity $login -pro Description 
        $x = $r.Description
        $t += "$b;$x`n"
        write-host "$b;$x`n"
    }
    $t >  C:\Scripts\files\ad\test.csv


    Всё вывелось так как мне нужно, а именно:

    Name;Size;Allocated;Files;Folders;% of Parent;Last Change;Last Access;Owner;
    ShkilevDA;383656,2 MB;383900,5 MB;120345;16215;8,1%;08.02.2017;09.02.2017;AytanovZK;"Сервис Москва"
    IlyinOV;304185,1 MB;304483,1 MB;151582;19397;6,4%;12.07.2017;12.07.2017;DubakSG;ООО "Инжиниринг"
    GertsevDA;202011,6 MB;202092,1 MB;41830;2376;4,3%;12.07.2017;12.07.2017;IvanovAA01;
    KitaevEE;184178,6 MB;184425,1 MB;128169;10381;3,9%;12.07.2017;11.07.2017;PirumovNR;

    Вот как теперь из того, что я вывел удалить "MB", то есть было ShkilevDA;383656,2 MB;383900,5 MB;120345;

    стало - ShkilevDA;383656,2;383900,5;120345;

    Спасибо за любой ответ!



    • Изменено eclegolas 12 июля 2017 г. 15:16 корректировка 2
    12 июля 2017 г. 15:14

Ответы

  • Добрый день!

    Есть файл csv такого вида:

    Name;Size;Allocated;Files;Folders;% of Parent;Last Change;Last Access;Owner
    ShkilevDA;383656,2 MB;383900,5 MB;120345;16215;8,1%;08.02.2017;09.02.2017;AytanovZK
    IlyinOV;304185,1 MB;304483,1 MB;151582;19397;6,4%;12.07.2017;12.07.2017;DubakSG
    GertsevDA;202011,6 MB;202092,1 MB;41830;2376;4,3%;12.07.2017;12.07.2017;IvanovAA01
    KitaevEE;184178,6 MB;184425,1 MB;128169;10381;3,9%;12.07.2017;11.07.2017;PirumovNR

    Необходимо из столбца Name (в нём логины пользователей AD) получить данные по пользователям из AD, а именно вывод Description и samaccountname. Я сделал скрипт такого вида:

     
    cls
    $a=""
    $m=@()
    $login = ""
    $t = ""
    
    $a = Get-Content -Path C:\Scripts\files\personal_12-07-2017.csv # -Encoding Unicode
    foreach ($b in $a){
        $m = $b.split(";")
        $login = $m[0]
        $r = Get-ADUser -Identity $login -pro Description 
        $x = $r.Description
        $t += "$b;$x`n"
        write-host "$b;$x`n"
    }
    $t >  C:\Scripts\files\ad\test.csv


    Всё вывелось так как мне нужно, а именно:

    Name;Size;Allocated;Files;Folders;% of Parent;Last Change;Last Access;Owner;
    ShkilevDA;383656,2 MB;383900,5 MB;120345;16215;8,1%;08.02.2017;09.02.2017;AytanovZK;"Сервис Москва"
    IlyinOV;304185,1 MB;304483,1 MB;151582;19397;6,4%;12.07.2017;12.07.2017;DubakSG;ООО "Инжиниринг"
    GertsevDA;202011,6 MB;202092,1 MB;41830;2376;4,3%;12.07.2017;12.07.2017;IvanovAA01;
    KitaevEE;184178,6 MB;184425,1 MB;128169;10381;3,9%;12.07.2017;11.07.2017;PirumovNR;

    Вот как теперь из того, что я вывел удалить "MB", то есть было ShkilevDA;383656,2 MB;383900,5 MB;120345;

    стало - ShkilevDA;383656,2;383900,5;120345;

    Спасибо за любой ответ!



    1 Для работы с CSV есть специальные командлеты Import-CSV / Export-CSV

    2 Если вам нужно просто в файле убрать слово или слова можно воспользоваться конструкцией

    $(Get-Content .\file.csv) -replace ' MB' | Set-Content .\file.csv

    В вашем случае эта задача будет выглядеть так

    Import-Csv "C:\Input.csv" -Delimiter ';' | foreach {
        $CurrentObject = $_
        $Description = $(Get-ADUser -Identity $CurrentObject.Name -Property Description).Description
        $CurrentObject | Add-Member -type NoteProperty -name Description -value $Description
        $CurrentObject.Allocated = $CurrentObject.Allocated -replace ' MB'
        $CurrentObject.Size = $CurrentObject.Size -replace ' MB'
        $CurrentObject
    } | Export-Csv 'C:\Result.csv' -Encoding Unicode

    The opinion expressed by me is not an official position of Microsoft

    • Изменено Vector BCOModerator 12 июля 2017 г. 15:59 Добавил чутка кода
    • Помечено в качестве ответа eclegolas 12 июля 2017 г. 16:51
    12 июля 2017 г. 15:28
    Модератор

Все ответы

  • Добрый день!

    Есть файл csv такого вида:

    Name;Size;Allocated;Files;Folders;% of Parent;Last Change;Last Access;Owner
    ShkilevDA;383656,2 MB;383900,5 MB;120345;16215;8,1%;08.02.2017;09.02.2017;AytanovZK
    IlyinOV;304185,1 MB;304483,1 MB;151582;19397;6,4%;12.07.2017;12.07.2017;DubakSG
    GertsevDA;202011,6 MB;202092,1 MB;41830;2376;4,3%;12.07.2017;12.07.2017;IvanovAA01
    KitaevEE;184178,6 MB;184425,1 MB;128169;10381;3,9%;12.07.2017;11.07.2017;PirumovNR

    Необходимо из столбца Name (в нём логины пользователей AD) получить данные по пользователям из AD, а именно вывод Description и samaccountname. Я сделал скрипт такого вида:

     
    cls
    $a=""
    $m=@()
    $login = ""
    $t = ""
    
    $a = Get-Content -Path C:\Scripts\files\personal_12-07-2017.csv # -Encoding Unicode
    foreach ($b in $a){
        $m = $b.split(";")
        $login = $m[0]
        $r = Get-ADUser -Identity $login -pro Description 
        $x = $r.Description
        $t += "$b;$x`n"
        write-host "$b;$x`n"
    }
    $t >  C:\Scripts\files\ad\test.csv


    Всё вывелось так как мне нужно, а именно:

    Name;Size;Allocated;Files;Folders;% of Parent;Last Change;Last Access;Owner;
    ShkilevDA;383656,2 MB;383900,5 MB;120345;16215;8,1%;08.02.2017;09.02.2017;AytanovZK;"Сервис Москва"
    IlyinOV;304185,1 MB;304483,1 MB;151582;19397;6,4%;12.07.2017;12.07.2017;DubakSG;ООО "Инжиниринг"
    GertsevDA;202011,6 MB;202092,1 MB;41830;2376;4,3%;12.07.2017;12.07.2017;IvanovAA01;
    KitaevEE;184178,6 MB;184425,1 MB;128169;10381;3,9%;12.07.2017;11.07.2017;PirumovNR;

    Вот как теперь из того, что я вывел удалить "MB", то есть было ShkilevDA;383656,2 MB;383900,5 MB;120345;

    стало - ShkilevDA;383656,2;383900,5;120345;

    Спасибо за любой ответ!



    1 Для работы с CSV есть специальные командлеты Import-CSV / Export-CSV

    2 Если вам нужно просто в файле убрать слово или слова можно воспользоваться конструкцией

    $(Get-Content .\file.csv) -replace ' MB' | Set-Content .\file.csv

    В вашем случае эта задача будет выглядеть так

    Import-Csv "C:\Input.csv" -Delimiter ';' | foreach {
        $CurrentObject = $_
        $Description = $(Get-ADUser -Identity $CurrentObject.Name -Property Description).Description
        $CurrentObject | Add-Member -type NoteProperty -name Description -value $Description
        $CurrentObject.Allocated = $CurrentObject.Allocated -replace ' MB'
        $CurrentObject.Size = $CurrentObject.Size -replace ' MB'
        $CurrentObject
    } | Export-Csv 'C:\Result.csv' -Encoding Unicode

    The opinion expressed by me is not an official position of Microsoft

    • Изменено Vector BCOModerator 12 июля 2017 г. 15:59 Добавил чутка кода
    • Помечено в качестве ответа eclegolas 12 июля 2017 г. 16:51
    12 июля 2017 г. 15:28
    Модератор
  • Спасибо Вам огромное! Если Вас не затруднит, можете мне объяснить, что вот тут Вы делаете:

    Add-Member -type NoteProperty -name Description -value $Description

    12 июля 2017 г. 16:50
  • PowerShell объектно ориентированный язык (все действия производятся с объектами у которых есть свойства и методы), в вашем случае при импорте CSV вы получаете 4 объекта с параметрами Name, Size, Allocated, Files, Folders, % of Parent, Last Change, Last Access, Owner.

    Строка о которой вы спрашиваете добавляет еще одно свойство типа NoteProperty (про возможные типы стоит почитать в справке и попробовать покрутить их самостоятельно), с именем "Description" и значением которое мы получаем из AD

    Если вы уберете

    | Export-Csv 'C:\Result.csv' -Encoding Unicode

    увидите что у вас есть объекты в которых добавилось значение, и читается это намного проще чем CSV, и в промежутки можно дополнительные обработки тулить


    The opinion expressed by me is not an official position of Microsoft


    12 июля 2017 г. 16:57
    Модератор
  • Vector BCO, ещё раз спасибо, сейчас буду мучать методы :)

    • Изменено eclegolas 12 июля 2017 г. 17:26 правка
    12 июля 2017 г. 17:26