使用Powershell打印包含制表符的txt文件
我正在尝试在Powershell中编写脚本,以自动打印文本文件的内容。但是,打印时会删除制表符,使最终输出难以读取 我提供了一个MWE来说明这个问题 MWE.txt的内容(以ANSI编码;a使用Powershell打印包含制表符的txt文件,powershell,csv,printing,xps,Powershell,Csv,Printing,Xps,我正在尝试在Powershell中编写脚本,以自动打印文本文件的内容。但是,打印时会删除制表符,使最终输出难以读取 我提供了一个MWE来说明这个问题 MWE.txt的内容(以ANSI编码;a→表示制表符): 我的powershell脚本: $fname = "C:\MWE.txt" Get-Content $fname | Out-Printer -name "Microsoft XPS Document Writer" 我使用XPS writer来避免浪费纸张,但最终它将被改为真正的打印机。
→代码>表示制表符):
我的powershell脚本:
$fname = "C:\MWE.txt"
Get-Content $fname | Out-Printer -name "Microsoft XPS Document Writer"
我使用XPS writer来避免浪费纸张,但最终它将被改为真正的打印机。真实纸张上的输出是相同的,我也排除了这一点
问题是,在打印输出中,制表符刚刚被擦除,从而产生:
FOO1,234,56
但是,如果我将输出打印机
改为输出字符串
,控制台将正确显示文件内容。我到底做错了什么?该文件在记事本和记事本++中都能正确显示,我也尝试过UTF-8编码
编辑2018-07-12 10:20
我试图打印的文件的内容结构,由系统自动生成,并放在我无权访问的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
你很接近了,你自己偶然发现了一个解决方法-使用输出字符串
。在将内容发送到打印机之前,您可以将输出字符串添加到管道中:
Get-Content $fname | Out-String | Out-Printer -Name "Microsoft XPS Document Writer"
如果上述操作不适用于您,您可以尝试自己处理制表符:
( Get-Content $fname -Raw ).Split( "`t" ) -Join "`t"
如果按预期显示输出,则可以通过管道将其传送到输出打印机
(输出字符串
不是必需的,因为-Join
连接成字符串):
然而,这似乎可能是打印机出了问题,因为注释和其他答案产生了不同的成功率。已知上述解决方法至少适用于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"
我没有任何解释-该症状听起来像是一个问题(这也会影响Microsoft Print To PDF
打印机),而且似乎特定于制表符,而空格可以正常工作
但是,我可以提供一个解决方案——假设最终目标是创建对齐的输出列,并且没有必要专门使用选项卡来实现这一点:
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对象
脚本块通过制表符将每个输入行拆分为标记,并使用包含单个标记的属性构造自定义对象
格式化表格
使用使用空格对齐的列创建表格输出-HideTableHeaders
禁止输出通常会显示(自动生成)属性名称的表标题
- 请注意,由于输入的行具有不同的列计数,
-FormatTable
必须明确指示要显示哪些列,这就是(1..6 |%{'col'+$})
所做的:它基于最多可以显示6列的假设创建所有自动生成列名的数组,您的示例输入正确-根据需要调整该数字。(为了安全起见,您也可以指定更高的数字,例如,20
,但这会降低处理速度
- 将
格式表
输出到输出打印机-名称为“Microsoft XPS Document Writer”
的管道似乎会产生所需的表格输出,其中列对齐
- 如果列值最终被截断(由
..
指示),则需要调整格式表
调用,例如使用自定义列宽-请参阅我的
对示例输入运行此命令将在控制台中生成以下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
默认情况下,Get Content
是否只返回字符串数组?抱歉,这不起作用。我没有尝试将Out字符串本身管道化,但实际上我尝试了通过echo
函数管道化。我刚刚测试了这一点,它解决了生成的xps文档中缺少选项卡的问题。请尝试Get Content$fname-原始打印机-名称“Microsoft XPS Document Writer”
.p.s.您确定编码是ANSI吗?获取内容
确实有一个-encoding
开关。如果仍然看不到选项卡,您可以尝试不同的编码。我已经尝试了上述所有方法,但没有成功。当然,只要所有列的字符宽度相同,就可以用空格替换选项卡字符(我的情况并非如此)但是,这会使人们相信“Tabor CuxActer”中的打印机< <代码>中存在一个错误。@ MKELEMNT0:谢谢!我会考虑这个被接受的答案,因为它为这个问题提供了一个很好的解决方案。然而,当标题解释时,有一个警告。(将列编号键入名称的顶行)相当长(使用-AutoSize
选项设置表格格式
)。原因是表格数据实际上不是从第一行开始的,而是从第一行开始处理的。我认为没有必要在这方面投入更多的精力,因为我希望在未来的版本中修复打印机
中假定的错误。-再次感谢所有帮助!@noffe:谢谢,需要处理图例的好处不同1.另一方面,在格式表
中有一个与-AutoSize
相关的实际错误:@noffe:另外,我在这里报告了原始错误(选项卡被剥离):
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"
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