在没有新行的情况下复制到 PowerShell 中的剪贴板

Copying to the clipboard in PowerShell without a new line

有没有办法在 PowerShell 中从 out-clipboardclip 中删除新行?

我正在使用此代码将当前路径复制到剪贴板:

function cl() {
    (Get-Location).ToString() | clip
}

而且每次我使用它时,都会在复制的文本中添加一个新行。这令人沮丧,因为我无法将其粘贴到 CLI 中,就像我粘贴从其他地方复制的文本一样。因为换行使得CLI上的命令自动执行。

示例:我在 C:\Users 并键入 cl,然后我使用 Alt + SPACE + E + P 传递文本,命令执行完毕,不能再打字了。但是当没有换行的情况下传递文本时,什么都不会执行,我可以继续输入。

Add-Type -Assembly PresentationCore
$clipText = (get-location).ToString() | Out-String -Stream
[Windows.Clipboard]::SetText($clipText)

正如@PetSerAl 在评论中指出的那样,当字符串对象通过管道发送时,PowerShell 添加了换行符。 Get-Location 的字符串化输出没有尾随换行符:

PS C:\> <b>$v = (Get-Location).ToString()</b>
PS C:\> <b>"-$v-"</b>
-C:\-

你可以试试 this:

Add-Type -AssemblyName System.Windows.Forms
$tb = New-Object Windows.Forms.TextBox
$tb.MultiLine = $true
$tb.Text = (Get-Location).ToString()
$tb.SelectAll()
$tb.Copy()

使用Set-Clipboard函数:

(get-location).ToString()|Set-Clipboard

以空字节结尾的字符串会解决这个问题。对不包含 Set-Clipboard

的 powershell 核心有用
function set-clipboard{
    param(
       [parameter(position=0,mandatory=$true,ValueFromPipeline=$true)]$Text
    )
    begin{
        $data = [system.text.stringbuilder]::new()
    }

    process{
        if ($text){
            [void]$data.appendline($text)
        }
    }

    end{
        if ($data){
            $data.tostring().trimend([environment]::newline) + [convert]::tochar(0) | clip.exe
        }
    }
}


"asdf" | set-clipboard