使用Powershell

时间:2018-07-10 13:55:52

标签: powershell csv printing xps

我正在尝试在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编码。

编辑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

2 个答案:

答案 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禁止输出表头,该表头通常会显示(自动生成的)属性名称。

    • 请注意,由于输入中的行具有 variable 列计数,因此必须明确指示-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