使用Powershell打印包含制表符的txt文件

使用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中编写脚本,以自动打印文本文件的内容。但是,打印时会删除制表符,使最终输出难以读取

我提供了一个MWE来说明这个问题

MWE.txt的内容(以ANSI编码;a
表示制表符):

我的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