Копирование в буфер обмена в PowerShell без новой строки

Есть ли способ удалить новую строку из out-clipboard или clip в PowerShell?

Я использую этот код для копирования текущего пути в буфер обмена:

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

И каждый раз, когда я его использую, в скопированный текст добавляется новая строка. Это расстраивает, потому что тогда я не могу вставить его в CLI, как будто бы с текстом, который копируется из другого места. Поскольку новая строка делает команду в CLI автоматически выполненной.

Пример: я нахожусь в C:\Users и набираю cl, а затем я использую Alt + SPACE + E + P, чтобы передать текст, команда выполнена, и я могу 't type no. Но когда текст передается без новой строки, ничего не выполняется, и я могу продолжать печатать.

Ответ 1

Как указано @PetSerAl в комментариях, новая строка добавляется PowerShell, когда строковый объект отправляется по конвейеру. Строковый вывод Get-Location не имеет этой конечной новой строки:

PS C:\> $v = (Get-Location).ToString()
PS C:\> "-$v-"
-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()

Ответ 2

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

Ответ 3

Используйте функцию Set-Clipboard:

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

Ответ 4

Завершение строки нулевым байтом позаботится об этом. Полезно для ядра powerhell, которое не содержит Set-Clipboard

function set-clipboard{
    param(
       [parameter(position=0,mandatory=$true,ValueFromPipeline=$true)]$Text
    )

    begin{
        $data = [system.text.stringbuilder]::new()
    }

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

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

"asdf" | set-clipboard