用Excel打开CSV文件后重新排列数组

vm0i2vca  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(97)

通过我的脚本,我得到了我电脑上所有已安装应用程序的列表,包括它们的版本。当我将其保存到csv文件中并用Excel打开时,它不会按行列出它们,而是在一行(单元格)中列出所有它们。我如何重新排列我的数组,应用程序列表,以便将它们单独排序到列的每一行(单元格)。

$currentUsername = $env:USERNAME
$computerName = $env:COMPUTERNAME
$timeStamp = Get-Date -Format "ss-mm-HH-dd/MM/yyyy"
$desktopPath = [System.IO.Path]::Combine($env:USERPROFILE, 'Desktop')
$outputFileName = "${timeStamp}_${currentUsername}_${computerName}.csv"
$outputFile = [System.IO.Path]::Combine($desktopPath, $outputFileName)

$installedApps = Get-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" | Where-Object { $_.DisplayName -ne $null }
$installedAppsList = $installedApps | ForEach-Object {"$($_.DisplayName) ($($_.DisplayVersion))"}

$data = [PSCustomObject]@{
    "Installierte Anwendungen"  = $installedAppsList -join ", "
}

$data | Export-Csv -Path $outputFile -NoTypeInformation  -Delimiter ";" -Encoding UTF8
kmbjn2e3

kmbjn2e31#

我觉得这个可以

$currentUsername = $env:USERNAME
$computerName = $env:COMPUTERNAME
$timeStamp = Get-Date -Format "ss-mm-HH-dd/MM/yyyy"
$desktopPath = [System.IO.Path]::Combine($env:USERPROFILE, 'Desktop')
$outputFileName = "${timeStamp}_${currentUsername}_${computerName}.csv"
$outputFile = [System.IO.Path]::Combine($desktopPath, $outputFileName)

$installedApps = Get-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" | Where-Object { $_.DisplayName -ne $null }
$installedAppsList = $installedApps | Select-Object -Property DisplayName, DisplayVersion

$installedAppsList | Export-Csv -Path $outputFile -NoTypeInformation  -Delimiter ";" -Encoding UTF8
h9vpoimq

h9vpoimq2#

在单个单元格中获取所有值的原因是,您正在创建一个具有1属性的PSCustomObject,并且将该属性设置为包含变量$installedAppsList的全部内容的字符串。
这发生在你的代码的这一部分:

$data = [PSCustomObject]@{
    "Installierte Anwendungen"  = $installedAppsList -join ", "
}

你可以这样做:

$installedAppsList | ConvertFrom-Csv -Header 'Installierte Anwendungen' | Export-Csv -Path $outputFile -NoTypeInformation  -Delimiter ";" -Encoding UTF8

在Excel中打开生成的文件,您将看到现在有一个名为“Installierte Anwendungen”的列,该列中的每个值都在其自己的单元格中。
或者你可以跳过使用ConvertFrom-Csv的需要,这样做:

$installedAppsList = $installedApps | ForEach-Object { New-Object psobject -Property @{'Installierte Anwendungen' = "$($_.displayName) $($_.displayVersion)"}}

在第二个示例中,我们将$installedAppsList创建为psobject数组,其中psobject具有名为Installierte Anwendungen的属性。
以下是关于这里发生的事情的更多信息:请务必记住,各种CSV相关cmdlet都是为处理对象及其属性而设计的。例如,当创建psobject $data时,它有一个名为“Installlierte Anwendungen”的属性,该属性的值是包含所有数据的字符串。当传递给Export-Csv时,该cmdlet会看到命名属性及其字符串值。
ConvertTo-Csv cmdlet也是如此。如果将$installedAppsList传递给ConvertTo-Csv,您将看到输出是变量中包含的每个字符串的长度。这是因为cmdlet发现变量包含字符串对象,而这些字符串对象只有一个名为length的属性。若要亲自查看,请向Get-Member cmdlet传递一个字符串。
关键是将数据转换为一种格式,其中数据由具有命名属性的对象组成,这些属性的值是您希望在输出中显示的数据。convertFrom-Csv可以为您做到这一点。在这种特殊情况下,必须包含-header参数。如果不包括,则数组中的第一个值将被视为头。完成此操作后,您将拥有一个psobjects数组,其中每个对象都有一个名为'Installlierte Anwendungen'的属性,其值为字符串。
此时,您可以将该psobject数组发送到Export-Csv cmdlet,它将正确地看到您需要一个名为“Installlierte Anwendungen”的列,该数组的每个索引都将成为输出中的一个单元格。

相关问题