2015-11-03 51 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