gpt4 book ai didi

windows - 使用 Windows Control-C 剪贴板复制时如何保留制表符 `n` n?

转载 作者:可可西里 更新时间:2023-11-01 14:14:30 26 4
gpt4 key购买 nike

我有一些不寻常的、相对复杂/大型的 PowerShell 脚本,它通过 Write-Host 输出彩色文本。我想将整个文本输出复制到 Windows 剪贴板而不丢失制表符(使用 Windows Control-C,剪贴板复制)或替代。如果我在 PowerShell.exe 控制台窗口中运行脚本后突出显示所有文本,然后按 control-C(复制到 Windows 剪贴板)制表符将转换为空格。

如果我尝试使用下面的 Set-Clipboard cmdlet 来传输我脚本的整个输出,我的脚本中有太多组件(主要是 Write-Host 行)与进一步的 PS 管道处理不兼容;因此,下面的 Set-Clipboard 被完全忽略(仅将输出显示到本地主机控制台)。

PS:我也尝试过 Start-Transcript\Stop-Transcript.. 但是,这也不会捕获标签。它将制表符转换为空格。

我希望有人有一个聪明、快速的方法来剪贴板捕获我从 cmdlet 获得的文本,这些 cmdlet 需要 write-host 也捕获 `t 制表符。

invoke-myscript -Devicename "WindowsPC" | Set-Clipboard
function Set-Clipboard {

param(
## The input to send to the clipboard
[Parameter(ValueFromPipeline = $true)]
[object[]] $InputObject
)

begin
{
Set-StrictMode -Version Latest
$objectsToProcess = @()
}

process
{
## Collect everything sent to the script either through
## pipeline input, or direct input.
$objectsToProcess += $inputObject
}

end
{
## Launch a new instance of PowerShell in STA mode.
## This lets us interact with the Windows clipboard.
$objectsToProcess | PowerShell -NoProfile -STA -Command {
Add-Type -Assembly PresentationCore

## Convert the input objects to a string representation
$clipText = ($input | Out-String -Stream) -join "`r`n"

## And finally set the clipboard text
[Windows.Clipboard]::SetText($clipText)
}
}

最佳答案

我认为您会找到的答案是使用 Write-Host 通常会让您走上一条您不希望的道路。 Jeffrey Snover在他的博客中讨论了这个。更改脚本以将 Write-Host 更改为 Write-Output 甚至可能使用颜色来决定是否应将其中一些更改为 Write-Verbose 和/或 Write-Warning 可能是值得的。

如果您这样做,那么您还有其他选择可供您使用,例如使用 -OutVariable 来精确捕获输出以进行进一步处理(自动化)。

以下示例展示了此类更改如何使您受益。

function print-with-tab {
[cmdletbinding()]
Param()

Write-Host "HostFoo`t`t`tHostBar"
Write-Output "OutFoo`t`t`tOutBar"
Write-Warning "You have been warned."
}

print-with-tab -OutVariable outvar -WarningVariable warnvar

Write-Output "Out -->"
$outvar
# proof there's tabs in here
$outvar -replace "`t", "-"
Write-Output "Warn -->"
$warnvar

输出

HostFoo         HostBar
OutFoo OutBar
WARNING: You have been warned.
Out -->
OutFoo OutBar
OutFoo---OutBar
Warn -->
You have been warned.

最后的想法

最后的想法是,如果您知道您没有任何包含 4 个空格的字符串(如果这是您的制表符变成的内容),那么获取您的输出,替换所有出现的 4 个空格,回到制表符,然后添加到剪贴板。 Hacky,但根据我之前关于使用 Write-Host 和进一步自动化所采取的路径的观点......这可能对你有用。

在那种情况下,我认为你可以使用类似的东西:

$objectsToProcess += $inputObject -replace "    ", "`t"

关于windows - 使用 Windows Control-C 剪贴板复制时如何保留制表符 `n` n?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34421971/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com