我有一些不寻常的,相对复杂/大的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)
}
}
答案 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参数;加上,复制粘贴和制表符与颜色输出兼容到本地控制台。