问题描述
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-Object
或 ForEach-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"