Powershell Forms - 从选定的 ListView 项目中检索值和列名

Powershell Forms - retrieve both values and column names from selected ListView item

我有一个使用 Powershell 表单的工作脚本,为了方便起见,我正在从列表视图中的当前选定项目中检索值,并将它们复制到剪贴板,如下所示:

$UIDlist.Add_SelectedIndexChanged({
    # Legacy Winforms behaviour can cause an error unless a null check is made
    If($UIDlist.SelectedItems -ne $null) {
        [string]$ClipText = $this.SelectedItems.SubItems.Text | ForEach-Object{$_ + "`r`n"}
        $ClipText | Set-Clipboard
})

显然这只会输出子项的文本值,例如

johnsmith01
johnsmith@company.com
\myserver\johnsmith01
GPO Main Office

是否有一种简单的方法也可以获取这些值的列名?例如

SamAccountName johnsmith01
EmailAddress   johnsmith@company.com
HomeDrive      \myserver\johnsmith01
DepoartmentGPO GPO Main Office

似乎有一个 Name 属性 的 ListView 子项目,但我在构建 ListView 时找不到填充它的方法:

BackColor : Color [Window]
Bounds    : {X=0,Y=0,Width=0,Height=0}
Font      : [Font: Name=Microsoft Sans Serif, Size=8.25, Units=3, GdiCharSet=0, GdiVerticalFont=False]
ForeColor : Color [WindowText]
Tag       : 
Text      : johnsmith01
Name      :

那么,在选择 ListView 项目时,是否有一种简单的方法来检索值和这些值的列名?

列表视图项的名称不是列名。如果您想区分呈现给用户的内容(文本)和您将在幕后工作的实际值,它就在那里。

要获取列名,您需要自己解决。 这是有用的东西。

Add_SelectedIndexChangedMethod 之前的某处声明,这样它就不会每次都被无意义地调用。

$ColumnsName = $ListView.Columns.Text
# Used for padded formatting
$LongestColLength = ($ColumnsName | % { $_.length } | Measure-Object -Maximum ).Maximum + 1
$ListView.Items[0].SubItems.text

以及实际的 $ClipText 部分

$ClipText = for ($i = 0; $i -lt $ColumnsName.Count  ;$i++) {
    "{0}: {1} `r`n" -f $ColumnsName[$i].PadRight($LongestColLength, ' '), $this.SelectedItems.SubItems[$i].Text
} 

输出

根据你的代码,我假设你想立即将它以漂亮的格式发送到剪贴板,但如果情况并非如此,我会生成一个你想要的 PSObject,这样你就可以做额外的事情轻松操控。

$ClipText = for ($i = 0; $i -lt $ColumnsName.Count  ;$i++) {
[PSCustomObject]@{
        ColumnName = $ColumnsName[$i]
        Text       = $this.SelectedItems.SubItems[$i].Text
    }
}

只要准备就绪,您仍然可以将新形成的 PSObject 转换为其最终格式。

用户友好(利用最长的列长度进行填充)

$ClipText | % { '{0}: {1}' -f $_.ColumnName.PadRight($LongestColLength,' '),$_.Text}

机器友好

$ClipText | ConvertTo-Json

如 Sage post 中的答案。在我的例子中,我需要添加以下内容以使剪贴板格式和输出正确:

    [string]$ClipText = for ($i = 0; $i -lt $ColumnsName.Count  ;$i++) {
        '{0}: {1}' -f $ColumnsName[$i].PadRight($LongestColLength, ' '), $this.SelectedItems.SubItems[$i].Text + "`r`n"
    } 

没有 [string] 只有最后一个对象在剪贴板中并且还需要回车 return/newline

我安装了 PSCX 模块,它修改了 Set-Clipboard 命令,所以 YMMV