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

时间:2015-12-22 18:09:36

标签: windows powershell tabs clipboard

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

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

PS:我也尝试过Start-Transcript \ Stop-Transcript ..但是,这也没有抓住标签。它将标签转换为空格。

我希望有人有一个聪明,快捷的方法来剪贴板捕获我需要写入主机的cmd文本的文本,这些文本也是`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)
    }
}

2 个答案:

答案 0 :(得分:3)

我认为你会发现答案是使用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"

答案 1 :(得分:0)

反对专家建议..我仍然认为我的解决方案对我的环境来说是最简单的(也是最理想的)。我不轻易做出这个决定;特别是当人们花费大量时间试图帮助我时。对不起马特!如果我已经在我的巨大脚本中没有一百万个写主机行,我会使用你的解决方案。

使用简单的search \ replace进行重构是最简单的解决方案(在我的例子中)。我可以将我的自定义写主机命名为' Write-Host2'。然后,只需将Write-Host2函数添加到我的脚本中。它将向后兼容大多数Write-Host参数;加上,复制粘贴和制表符与颜色输出兼容到本地控制台。