我真的很挣钱似乎是一件简单的事情。任何帮助表示赞赏...
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"但我遇到了很多麻烦...
处理此问题的最佳方法是什么?
答案 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