Powershell 如何导出每个项目都位于一个单元格中的多行CSV?

Powershell 如何导出每个项目都位于一个单元格中的多行CSV?,powershell,csv,user-interface,active-directory,Powershell,Csv,User Interface,Active Directory,我对构建gui的PowerShell世界有点陌生,但我已经成功创建了一个gui,用几句话在广告中搜索用户,如果查找的信息正确,它将使用Out File命令将其存储在CSV上 下面是一个例子 Enabled : False Locked : False DisplayName : John Doe_test GivenName : John SurName : doe_test SamAccountName : j

我对构建gui的PowerShell世界有点陌生,但我已经成功创建了一个gui,用几句话在广告中搜索用户,如果查找的信息正确,它将使用Out File命令将其存储在CSV上

下面是一个例子

 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@$datusr,$save_btn $datusr.Text=Get ADUser-filter{DisplayName-eq$username}-Properties*|选择启用的对象,{Expression={$.LockedOut};Label='Locked'},DisplayName,GivenName,姓氏,SamAccountName,Mail,OfficePhone,@{Expression={[DateTime]::FromFileTime$..LastLogon};Label='Last Logon'},@{Expression={Expression={,passwordlastset |输出字符串 $data\u usr=$datusr.text $save\u btn.添加\u单击{ 写入主机$data\u usr $data_usr | Out文件C:\scripts\data load.csv-Encoding UTF8-Append-Force } 我想知道,因为它让我抓狂如何在A1上启用,结果在A2上为假,等等,因为每个项目都在一行中。 我已经尝试导出到csv,但是,因为它来自一个变量,所以它只存储输出的长度,而不存储值

我希望以这种方式存储:

Enabled  Locked Username
False   False   JohnDoe
导出CSV有一个名为-NoTypeInformation的开关。将其附加到cmdlet后,它只保存数据。但是,您需要将数据作为对象保存,而不是像现在这样转换为字符串。 为此,将从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*。您不需要添加默认情况下返回的属性,请参见第一条代码注释


另外,我建议在用户属性上搜索用户,而不是在用户显示名上搜索用户,因为这会使GUI的用户输入诸如Bloggs、Joe和Joe Bloggs之类的变体。EmailAddress可能更精确。

这不是CSV文件。[grin]这是一个有点结构化的纯文本文件。您是否尝试过查看Export-CSV cmdlet?它设计用于将对象导出到CSV文件…是的!当我导出到CSV时,它会重新运行此类型System.String Length 368,该类型是因为您忘记使用-NoTypeInformation参数。[grin]值为368的长度列表示您的对象不是结构化对象。原因是因为这是一个字符串哦,非常感谢!我离这里不远。在之前的代码版本中,我做了类似的事情,但我没有声明$props!非常感谢你@费德戈多我很高兴它对你有用。如果你觉得我的答案解决了你的问题,请考虑通过点击来接受答案。✓ 左边的图标。看见这将帮助其他有类似问题的人更容易地找到它。谢谢Theo,这是一个很大的帮助,也是一个很好的关于我将来如何编写代码的指导。我在空闲时间自学成才,有时我会错过一些显而易见的事情,以至于我只能一笑置之