Как экспортировать многострочный CSV-файл, в котором каждый элемент находится в одной ячейке? - PullRequest
0 голосов
/ 16 июня 2020

Я новичок в мире PowerShell, связанном с построением gui, но мне удалось создать gui, который в нескольких словах выполняет поиск пользователей в AD, и если найденная информация верна он сохранит его в CSV с помощью команды Out-File.

Пример выглядит следующим образом.

 Enabled         : False
 Locked          : False
 DisplayName     : John Doe_test
 GivenName       : John
 SurName         : doe_test
 SamAccountName  : johndoe
 Mail            : ftestaddress@somemail.com
 OfficePhone     : 9999
 Last Logon      : 31/12/1600 21:00:00
 Date Created    : 7/6/2020 18:02:56
 passwordlastset : 7/6/2020 18:02:56

И код, который выводит его, и есть этот (это часть, выполняет поиск пользователя, отображает его в текстовом поле только для чтения, и если конечный пользователь прав, щелкнув другую кнопку, он сохранит данные (значение хоста записи предназначено только для проверки данных, в противном случае мне придется ввести файл csv каждый раз, когда я его сохраняю.

$Formselected.controls.addrange(@($datousr,$save_btn))
$datousr.Text= Get-ADUser -filter {DisplayName -eq $username} -Properties * |Select-Object Enabled, @{Expression={$_.LockedOut};Label='Locked';}, DisplayName, GivenName, SurName, SamAccountName, Mail, OfficePhone, @{ Expression ={[DateTime]::FromFileTime($_.LastLogon)}; Label='Last Logon';}, @{Expression={$_.Created};Label='Date Created';}, passwordlastset | Out-String
$data_usr=$datousr.text
$save_btn.Add_Click{
    Write-Host "$data_usr"
    $data_usr |Out-File "C:\scripts\data load.csv"  -Encoding UTF8 -Append -Force
}

Я хочу знать, потому что это сводит меня с ума, как использовать "включить" на A1 и результат, который будет "False" на A2 и так далее потому что каждый элемент находится в строке. Я пробовал экспортировать в csv, но, поскольку он исходит из переменной, он сохраняет только длину вывода, а не значение.

Я бы хотел, чтобы таким образом:

Enabled  Locked Username
False   False   JohnDoe

1 Ответ

1 голос
/ 16 июня 2020

Export-CSV имеет переключатель под названием -NoTypeInformation. Когда это добавлено к командлету, он сохраняет только данные. Однако для этого вам нужно сохранить данные как Object , а не преобразовывать их в строку, как сейчас. Для этого измените кодовый блок, в котором информация о пользователе собирается из AD, на следующий:

# properties DistinguishedName, Enabled, GivenName, Name, ObjectClass, ObjectGUID, SamAccountName, SID, Surname, UserPrincipalName are returned by default.
$props    = 'LockedOut','DisplayName','EmailAddress','OfficePhone','LastLogonDate','Created','PasswordLastSet'

# use the `script:` scope on the variable, so the button click has access to it
$script:data_usr = Get-ADUser -Filter "DisplayName -eq '$username'" -Properties $props -ErrorAction SilentlyContinue | 
                   Select-Object Enabled, 
                                 @{Name = 'Locked'; Expression = {$_.LockedOut}},
                                 DisplayName, GivenName, SurName, SamAccountName,
                                 @{Name = 'Mail'; Expression = {$_.EmailAddress}},
                                 OfficePhone, 
                                 @{Name = 'Last Logon'; Expression = {$_.LastLogonDate}},
                                 @{Name = 'Date Created'; Expression = {$_.Created}},
                                 PasswordLastSet

# display the data in the text box by formatting it as list and converting it to a string
$datousr.Text = ($data_usr | Format-List | Out-String)

Затем в коде, в котором вы сохраняете данные в CSV, выполните:

$save_btn.Add_Click({
    Write-Host $data_usr  # display in the console
    # save as proper CSV file (append to if the file already exists)
    $script:data_usr | Export-Csv -Path "C:\scripts\data_load.csv" -Encoding UTF8 -Append -NoTypeInformation
})

Обратите внимание, что лучше назвать нужные свойства из Get-ADUser, чем использовать -Properties *. Вам не нужно добавлять свойства, возвращаемые по умолчанию (см. Первый комментарий к коду).

Кроме того, я бы рекомендовал искать пользователя по атрибуту пользователя, отличному от DisplayName пользователя, потому что это побуждает пользователей ваш GUI, чтобы ввести такие варианты, как Bloggs, Joe или Joe Bloggs. EmailAddress может быть более точным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...