【问题标题】:How to export a multi line CSV that every item is in one cell?如何导出每个项目都在一个单元格中的多行 CSV?
【发布时间】:2020-06-16 17:48:48
【问题描述】:

我对与构建 gui 相关的 PowerShell 世界有点陌生,但我设法创建了一个 gui,简而言之,它在 AD 中搜索用户,如果查找的信息正确,它将存储在带有 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

输出的代码就是这个(这是搜索用户的部分,将其显示在只读文本框中,如果最终用户正确点击另一个按钮,它将存储数据。(写入Host值只是为了测试数据,否则每次存储都要输入到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 上设置“启用”以及结果,在 A2 上为“假”等等,因为每个项目都在一行中。 我试过导出到 csv,但是,因为它来自一个变量,所以它只存储输出的长度,而不是值。

我想以这种方式存储:

Enabled  Locked Username
False   False   JohnDoe

【问题讨论】:

  • 这不是 CSV 文件。 [grin] 它是一个有点结构化的纯文本文件。您是否尝试过查看Export-CSV cmdlet?它设计用于将对象导出到 CSV 文件...
  • 是的!当我导出到 CSV 时,它会返回这个 #TYPE System.String Length 368
  • #TYPE 是因为您忘记使用-NoTypeInformation 参数。 [grin] 值为368Length 列表示您的对象不是结构化对象。原因是这个>>> | Out-String 破坏你的结构化对象 并给你一个字符串。 Export-CSV cmdlet 需要一个结构化对象。

标签: powershell csv user-interface active-directory


【解决方案1】:

Export-CSV 有一个名为-NoTypeInformation 的开关。将其附加到 cmdlet 后,它仅保存数据。但是,您需要将数据保存为 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, JoeJoe Bloggs。电子邮件地址可以更精确。

【讨论】:

  • 哦,非常感谢!我并没有那么远。在以前的代码版本中,我做了类似的事情,但我没有声明 $props!非常感谢!
  • @FedeGodoy 我很高兴它对你有用。如果您觉得我的回答解决了您的问题,请考虑通过单击左侧的 ✓ 图标来接受答案。见How to accept SO answers。这将帮助其他有类似问题的人更轻松地找到它。
  • 感谢 Theo,这是一个很大的帮助,并且对我将来如何编写代码提供了很好的指导。 (我是在空闲时间自学成才的人,有时我会错过一些显而易见的事情,以至于我只能一笑置之)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
相关资源
最近更新 更多