Копирование в буфер обмена в 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