2015-11-03 99 views
3

我真的很挣扎似乎是一件简单的事情。任何帮助表示赞赏...在PowerShell输出中替换NULL值

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,它将引发循环的程序,因为它需要一个字符串。我试图将这些改为字符串“无数据”,但我有很多麻烦...

什么是最好的方式来处理这个问题?

+0

你问空字符串改为“无数据“在出口或进口? –

回答

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 
+0

自定义对象用于演示示例中对象的创建,而不是显示它是必需的。发布后,我删除了我的答案,因为经过一番思考,我认为有一个更好的方法,您不必为每个属性明确转换。 – dugas

+0

嗯,我没有输入任何东西......我正在使用get-itemproperty cmdlet来解析注册表项。数据被导出为CSV,但这不是关键。看看你的选择对象的例子,我想我可以使它工作。 – bonneyt

+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 $_ 
} 
+0

感谢您使用$ _。PSObject.Properties的想法!能够修改的版本(因为我只想要空值,并且因为它不处理int为0的int)。而不是[string] :: empty,使用$ null。意味着你不需要写一些东西来处理每一个经过的领域。绝对是Powershell的方式来做到这一点。 – mbourgon

0

做你的列有标题?当我输出一组CSV及其所有者时,我就​​是这么做的。对于那些没有在“的ManagedBy”列所有者的任何组,它填补了该领域与“否所有者”,而不是一个空格:

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

你可以只改变“的ManagedBy”你的头名称和“$ _。ManagedBy”来满足您的需求,那么显然“没有拥有者”就是“无数据”。

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 
0

可能工作的另一种选择:

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