我正在尝试在Powershell中编写脚本以自动打印文本文件的内容。但是,我的制表符在打印时被删除,使得最终输出难以阅读。
我提供了MWE来说明问题。
MWE.txt的内容(以ANSI编码; →
代表制表符):
FOO→1,23→4,56
我的powershell脚本:
$fname = "C:\MWE.txt"
Get-Content $fname | Out-Printer -name "Microsoft XPS Document Writer"
我正在使用XPS编写器来避免浪费纸张,但最终它将更改为一台真正的打印机。实际纸张上的输出是相同的,我也排除了这一点。
问题是在打印输出中,制表符只是被擦除,产生:
FOO1,234,56
但是,如果我改为将Out-Printer
更改为Out-String
,则控制台会正确显示文件内容。我到底在做什么错?该文件可以在记事本和记事本++中正确显示带有选项卡的标签,并且我也尝试过UTF-8编码。
我要打印的文件的内容结构,该结构由系统自动生成,并放在我无法访问的Web服务器上。为了清楚起见,我使用→
表示制表符,·
表示空格:
MWE·-·TestFile·:·
0)→Time
1)→Temperature·1
2)→Humidity
3)→Pressure·A-B
4)→Pressure·A-C
5)→Pressure·D-C
0)···················→1)→2)→3)→4)→5)→
2018-07-04 12:00:00→22,03→5,34→18,93→23,10→10,10
2018-07-04 13:00:00→21,99→5,22→18,75→23,56→10,00
2018-07-04 14:00:00→21,99→5,17→18,55→23,54→10,15
2018-07-04 15:00:00→22,03→5,25→18,73→23,41→8,33
答案 0 :(得分:2)
您接近了,您自己偶然发现了一种解决方法-使用Out-String
。您可以在将内容发送到打印机之前将Out-String
添加到管道:
Get-Content $fname | Out-String | Out-Printer -Name "Microsoft XPS Document Writer"
如果上述方法不起作用,您可以尝试自己处理制表符:
( Get-Content $fname -Raw ).Split( "`t" ) -Join "`t"
如果该显示的是您期望的输出,则可以将其通过管道传递到Out-Printer
(因为Out-String
串联成一个字符串,所以不需要-Join
):
( Get-Content $fname -Raw ).Split( "`t" ) -Join "`t" |
Out-Printer -Name "Microsoft XPS Document Writer"
但是,似乎Out-Printer
可能是一个错误,因为评论和其他答案产生了不同的成功率。已知上述解决方法至少可以在Windows 10.0.15063.0
(我当前正在运行并经过测试的版本)上运行,但是可能已在更高版本中停止工作。
您可以尝试将选项卡转换为空格:
# This is set to 5 spaces here, but can be any number of
# spaces you want to represent a tab character
$replaceTabString = " "
( Get-Content $fname -Raw ).Replace( "`t", $replaceTabString ) |
Out-Printer -Name "Microsoft XPS Document Writer"
答案 1 :(得分:1)
我没有解释-症状听起来像是bug(也影响Microsoft Print To PDF
打印机),并且似乎是 tab em>字符,而空格可以正常工作。
但是,我可以提供一个解决方法-假设最终目标是创建 aligned 输出列,并且不需要使用 tabs < / em>专门实现以下目的:
Get-Content "C:\MWE.txt" | ForEach-Object {
# Construct a custom object whose properties contain the
# tab-separated tokens on the input line.
$obj = New-Object PSCustomObject; $i = 0
foreach ($val in $_ -split "`t") {
Add-Member -InputObject $obj -NotePropertyName ('col' + ++$i) -NotePropertyValue $val
}
$obj
} | Format-Table -Property (1..6 | % { 'col' + $_ }) -HideTableHeaders |
Out-Printer -Name "Microsoft XPS Document Writer"
ForEach-Object
脚本块通过制表符将每个输入行分割为标记,并构造一个具有包含各个标记的属性的自定义对象。
Format-Table
使用带有空格的列创建表输出; -HideTableHeaders
禁止输出表头,该表头通常会显示(自动生成的)属性名称。
-FormatTable
要显示的列,(1..6 | % { 'col' + $_ })
的作用是:根据最多可以存在 6列的假设创建一个包含所有自动生成的列名称的数组,这对您的示例输入是正确的-根据需要调整该数字。 (为安全起见,您也可以指定一个较大的数字,例如20
,但这会减慢处理速度。将Format-Table
的输出输到Out-Printer -Name "Microsoft XPS Document Writer"
似乎会产生所需的具有对齐列的表格输出。
...
表示),则需要调整Format-Table
调用,例如使用自定义列宽-请参见{{3 }}。针对您的示例输入运行此命令,将在控制台中产生以下6列布局,并且输出XPS文档的呈现方式类似:
MWE·-·TestFile·:·
0) Time
1) Temperature·1
2) Humidity
3) Pressure·A-B
4) Pressure·A-C
5) Pressure·D-C
0)··················· 1) 2) 3) 4) 5)
2018-07-04 12:00:00 22,03 5,34 18,93 23,10 10,10
2018-07-04 13:00:00 21,99 5,22 18,75 23,56 10,00
2018-07-04 14:00:00 21,99 5,17 18,55 23,54 10,15
2018-07-04 15:00:00 22,03 5,25 18,73 23,41 8,33