替换PowerShell输出中的NULL值

时间:2015-11-03 15:44:42

标签: csv powershell

我真的很挣钱似乎是一件简单的事情。任何帮助表示赞赏...

tldr;我试图从powershell中查找并替换空白或NULL值 输出到"无数据"

我使用以下powershell脚本来获取已安装的应用程序信息

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*

以下是上述脚本的示例输出(根据我的喜好过滤)。我将这些数据导出为CSV,以便稍后导入另一个应用程序进行分析。

Host             : Computer1
DisplayName      : AutoDWG DWG DXF Converter 2015
Version          : 
Publisher        : 
InstallDate      : 
arrival_datetime : 2015-11-03T09:42:18

Host             : Computer2
DisplayName      : Beyond Compare Version 3.1.11
Version          : 
Publisher        : Scooter Software
InstallDate      : 20150218
arrival_datetime : 2015-11-03T09:42:18

CSV导出会以正确的格式显示数据,但如果项目没有版本,发布商等数据,则表示为" ,," (见下文)

"Computer1","AutoDWG DWG DXF Converter 2015",,,,"2015-11-03T09:54:21"
"Computer2","Beyond Compare Version 3.1.11",,"Scooter Software","20150218","2015-11-03T09:54:21"

导入CSV时,空值会被重新解释为NULL,这会抛出程序循环,因为它需要一个字符串。我试图将这些更改为字符串" No Data"但我遇到了很多麻烦...

处理此问题的最佳方法是什么?

5 个答案:

答案 0 :(得分:4)

您可以检查从Import-Csv cmdlet传送的属性值,然后更改它们。例如:

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | 
ForEach-Object { 
foreach ($p in $_.PSObject.Properties) 
{ 
 if ($p.Value -eq [string]::Empty)
 {
  $p.Value = 'No Data'
 }
} 
 Write-Output $_
}

答案 1 :(得分:2)

使用Select-Object是您最好的选择。只需将数据传输到Select-Object,但按如下方式自定义每个所需的属性:

Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | 
  Select-Object Host, DisplayName, @{
    Label = "Version"
    Expression = { if ($_.Version) { $_.Version } else { "No Data" } }
  }, Other Properties

答案 2 :(得分:1)

建立this answer,您可以生成如下计算属性:

$SelectProperties = "Host","DisplayName"
$NoDataFields = "Version","Publisher","InstallDate"

$SelectProperties += $NoDataFields|ForEach-Object {
    @{
      Label = $_
      Expression = [scriptblock]::Create("if(`$_.""$_""){ `$_.""$_"" } else { ""No Data"" }")
    }
}

$Data = Import-Csv -Path "C:\SomePath.csv" | 
  Select-Object $SelectProperties

答案 3 :(得分:0)

您的列是否有标题?当我导出一组CSV及其所有者时,我就​​是这样做的。对于在" ManagedBy"中没有所有者的任何群组。专栏,它填补了#34;没有所有者"而不是空格:

$CSVData = Import-Csv $TempCSV -Header "samAccountName", "ManagedBy"  
$CSVData | %{
if($_.ManagedBy -eq "") {$_.ManagedBy="No Owner"}
} 
$CSVData | Export-Csv $Filename -NoTypeInformation

您可以更改" ManagedBy"到你的标题名称和" $ _.ManagedBy"根据你的需要,显然"没有所有者"将是"没有数据"。

答案 4 :(得分:0)

可能有效的另一种选择:

$TargetFile = "C:\temp\replaceNull.csv"
$File = Get-Content $TargetFile
$Output = @()
foreach ($Line in $File) {
    $Output += $Line -replace ",,",",No Data,"
}
$Output | Set-Content $TargetFile