Powershell import-csv $variable 正确为空

问题描述

Powershell 2.0 版有一个奇怪的问题。

以下适用于较新版本,但在此版本上无法按预期工作。任何帮助表示赞赏。

$DB = Import-Csv -Path "$($path)\DBExtrat.csv"

这很好。 DBExtrat.csv 中的标题 ('hostname','hostip','name','type') 如果我运行,所有 4 个标题都会重新组织并显示

$DB

但是如果我尝试 $DB.name$DB.hostname 它返回注释。我需要能够像这样调用它,因为我的整个逻辑都与那些特定的变量名称相关联。

我已经尝试添加 -header 选项:

$DB = Import-Csv -Path "$($path)\DBExtrat.csv" -Header 'hostname','type'

但它不起作用,并且还会创建带有标题数据的不必要的额外行。

解决方法

使用 $DB.name 等表达式,您试图通过执行属性来获取集合 name所有元素$DB 属性值访问整个集合

此功能称为member enumeration,并且仅在 PowerShell v3+ 中可用

PowerShell v2 等效项需要使用 Select-ObjectForEach-Object

# Note the use of -ExpandProperty to ensure that only the property *value*
# is returned (without it,you get a *custom object* with a 'name' property).
$DB | Select-Object -ExpandProperty name

# Slower alternative,but can provide more flexibility
$DB | ForEach-Object { $_.name }
,

我建议使用@mklement0 答案;简短而简单。或者,离开您在评论中提出的问题,您可以尝试使用自定义对象并查看以下内容是否有效。

$import = Import-Csv -Path "$($path)\DBExtrat.csv"
$Object = New-Object psobject -Property @{
    'hostname' = $import | Select-Object -ExpandProperty hostname
    'hostip'   = $import | Select-Object -ExpandProperty hostip
    'name'     = $import | Select-Object -ExpandProperty name
    'type'     = $import | Select-Object -ExpandProperty type   
}
    "$Object.hostname - $Object.hostip"