powershell - 通过动态变量名获取变量

标签 powershell parameters

如何使用动态注释属性名称访问从 CSV 文件导入的数据?也就是说,人们事先并不知道列名称。它们确实与模式匹配,并在脚本运行时从 CSV 文件中提取。

举个例子,考虑一个 CSV 文件:

"Header 1","Header A","Header 3","Header B"
0,0,0,0
1,2,3,4
5,6,7,8

我只想提取以字母结尾的列。为此,我读取标题行并使用正则表达式提取名称,如下所示,

$reader = new-object IO.StreamReader("C:\tmp\data.csv")
$line = $reader.ReadLine()
$headers = @()

$line.Split(",") | % {
    $m = [regex]::match($_, '("Header [A-Z]")')
    if($m.Success) { $headers += $m.value } }

这将获取我关心的所有列名称:

"Header A"
"Header B"

现在,要访问 CSV 文件,我像这样导入它,

$csvData = import-csv "C:\tmp\data.csv"

Import-CSV 将创建一个具有标题行属性的自定义对象。人们可以通过 NoteProperty 名称访问字段,如下所示,

$csvData | % { $_."Header A" } # Works fine

这显然需要提前知道列名。我想使用我提取并存储到 $headers 中的列名称。我该怎么做?

到目前为止我尝试过的一些事情

$csvData | % { $_.$headers[0] } # Error: Cannot index into a null array.
$csvData | % { $np = $headers[0]; $_.$np } # Doesn't print anything.
$csvData | % { $_.$($headers[0]) } # Doesn't print anything.

我可以像这样更改脚本,这样它将编写另一个知道列名称的脚本。这是我唯一的解决方案吗?

最佳答案

我想你想要这个:

[string[]]$headers = $csvdata | gm -MemberType "noteproperty" | 
                        ?{ $_.Name -match "Header [a-zA-Z]$"} | 
                        select -expand Name
$csvdata | select $headers

选择与条件匹配的 header (在本例中为以字符结尾的 header ),然后获取这些 header 的 csv 数据。

关于powershell - 通过动态变量名获取变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8525481/

相关文章:

windows - Powershell 获取凭据失败

powershell - 显示在 "Processes"而不是 "Applications"

azure - 使用 az powershell 创建 azure AD 应用程序

C API : why are functions using returnParameters with buffer + size instead of returning char*

forms - "Are you sure?"通过 powershell 中的消息框

PowerShell 字符串插值语法

java - 在Java中,我如何在函数 "1"(不使用参数)中使用在函数 "A"内部生成的数组 "B"?

c++ - 如何在构造函数中将数组作为参数传递? C++

javascript - 将 (ID) 参数从 aspx 页面传递到 javascript 函数,该函数更新页面上其他位置的 ID

c# - 什么时候使用 C# ref 关键字是个好主意?