Set-Clipboard 仅在快速连续调用时记住最后一个值

aki*_*lin 4 clipboard powershell

我正在尝试创建一个 powershell 代码段,它将多行管道输入的第一列复制到剪贴板。

预期用途是:kubectl get pods | copyfirst
这应该允许我在剪贴板中拥有所有 pod 名称,并使用 Win+V 选择我需要的单个 pod 名称。

到目前为止我所拥有的是:

function copyfirst {
    [CmdletBinding()]Param([Parameter(ValueFromPipeline)]$Param)
    process {
        $Param.Split(" ")[0] | Set-Clipboard
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是 - 这只会将最后一个条目复制到剪贴板,而所有其他条目都被忽略。

如果我更改Set-Clipboard为其他命令 - 它会按预期工作。例如echo输出所有 pod 名称,而不仅仅是最后一个。

San*_*zon 5

我认为mklement0 的答案是正确的答案,我认为我们没有人知道 Win+V 剪贴板功能,或者至少我没有。所以,你是对的,就像你之前所说的那样快速连续完成时,它似乎无法捕捉历史。

所以只需添加Start-Sleep它就可以正常工作:

function copyfirst {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline)]
        [array]$Param
    )

    process {
        $Param.Split(" ")[0] | Set-Clipboard
        Start-Sleep -Milliseconds 250
    }
}

@'
string1 string4
string2 string5
string3 string6
'@ -split '\r?\n' | copyfirst
Run Code Online (Sandbox Code Playgroud)

它应该捕获string1,string2string3

调整睡眠计时器,直到它不太慢并且可以捕获所有内容。


经过一些测试,似乎Start-Sleep可以减少到-Milliseconds 250,低于会产生不一致的结果。

  • @AbrahamZinala 基本上是为了使其与 unix 和 windows 兼容,`\r\n` 是特定于 windows 的。但是,由于这个问题是特定于 Windows 的,因此本示例不需要。 (2认同)