【问题标题】:Select-Object selecting multiple objects but splitting the results and trimming them export to CSVSelect-Object 选择多个对象但拆分结果并修剪它们导出到 CSV
【发布时间】:2017-07-29 03:36:25
【问题描述】:

我有一个脚本,它从计算机列表中读取数据,并进行测试连接。如果它从Test-Connection 得到回复,它会执行 if/else 并从 Get-ChildItem 构建一个变量,该变量从可疑系统 C:\Users 读取以查看最后登录的人并选择名称和最后写入最后一个用户登录的时间,并对结果进行Write-Host。如果Test-Conneciton 没有得到回复,它会使用“离线”语句构建系统名称的变量并执行Write-Host 来显示它。然后,为了完成这一切,它将结果导出到 CSV。

我遇到的一些问题:

  • Get-ChildItem 的变量执行Select-Object Name, LastWriteTime 并将结果构建到变量中。我想单独而不是组合显示这些结果(当然也可以将它们导出到 CSV)。
  • 我需要修剪结果或修改脚本,使其不包含多余的字符。

下面是当Test-Connection收到机器回复时Get-ChildItem的结果示例(当然系统名称、IP地址和用户名已经更改以保护无辜者):

SYSTEMNAME @{IPV4Address=192.168.0.1} @{Name=John.Doe; LastWriteTime=03/08/2017 08:11:48}

名称和上次写入时间组合在结果中,我需要在显示和 CSV 导出中将它们分开,并修剪多余的字符。像这样,系统名称、IP 地址、名称和 lastwritetime 都将出现在 CSV 中它们自己的单元格中:

SYSTEMNAME 192.168.0.1 Name=John.Doe LastWriteTime=03/08/2017 08:11:48

代码如下:

$computerList = Get-Content "D:\filelocation\LastLogIn.txt"
foreach ($Computername in $computerList) {
  $ipreachable = Test-Connection $computerName -EA SilentlyContinue -Count 1 |
                 select IPV4address
  $output =@()
  if ($ipreachable) {
    $LastUserLoggedIn = Get-ChildItem "\\$computername\c$\Users" -EA SilentlyContinue |
                        Sort-Object LastWriteTime -Descending |
                        Select-Object Name, LastWriteTime -First 1
    $Details = "$LastUserLoggedIn"
    Write-Host $computername $ipreachable $Details
  } else {
    $details = "$computerName Computer does not exisit or is offline"
    Write-Host $Details
  } 
  [PSCustomObject]@{
    SystemName = $Computername
    IPV4Address = $ipreachable
    UserLogInDetails = $details
  } | Export-Csv "D:\filelocation\lastuserreults.csv" -NoType -Append
}

【问题讨论】:

    标签: powershell export-to-csv


    【解决方案1】:

    扩展IP地址:

    ... | Select-Object -Expand IPV4Address | Select-Object -Expand IPAddressToString
    

    并且不要将目录信息变成字符串:

    <strike>$Details = "$LastUserLoggedIn"</strike>

    像这样构建您的数据对象:

    $obj = [PSCustomObject]@{
      SystemName  = $Computername
      IPV4Address = $ipreachable
      UserName    = $LastUserLoggedIn.Name
      Timestamp   = $LastUserLoggedIn.LastWriteTime
    }
    

    这样您就可以在控制台上显示信息并将其导出为 CSV:

    $obj | Format-Table -AutoSize
    $obj | Export-Csv 'C:\path\to\your.csv' -NoType -Append
    

    【讨论】:

    • 谢谢。它完美地修剪了 IP 和名称,但是,它现在有其他问题。它保存以下变量的信息并将它们填充到列表中的所有系统。 : UserName = $LastUserLoggedIn.Name Timestamp = $LastUserLoggedIn.LastWriteTime 所有其他变量都给出正确的输出。
    • 您需要在每次迭代时重置$LastUserLoggedIn,否则如果无法访问主机,该变量将保留前一次迭代的值。
    • 谢谢。这就是问题所在。我放了一个明确的变量 LastUserLoggedIn ,这正是我所需要的。感谢您的帮助
    猜你喜欢
    • 2021-07-16
    • 1970-01-01
    • 2023-02-15
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2018-11-18
    • 1970-01-01
    相关资源
    最近更新 更多