将Powershell输出管道到文本文件

时间:2018-08-17 15:52:04

标签: powershell csv powershell-v2.0

我有以下Powershell脚本,该脚本使用顺序的文件名将文件从一个位置重命名为另一个位置。最终,这些文件更改需要映射,就像原始的一样-新建。当前,我只有一个Write-Host cmdlet,我只是将cmd Windows输出复制到txt文件中,然后通过编写的python脚本运行,以将原始文件和重命名的文件吐出为excel文件。我想知道在最初的ps脚本中是否有更简单的方法来做到这一点。即使制表符分隔的内容也可以轻松地复制粘贴到excel文件中。

Set-Location -Path "C:\Users\mmcintyre\Desktop\grail_new"
$destLoc = "C:\Users\mmcintyre\Desktop\renamed"
$countRef = [ref] 0
Get-ChildItem -Filter *.pdf -Recurse |
   Copy-Item -WhatIf -Destination { '{0}\{1}.pdf' -f $destLoc,++$countRef.Value }

任何帮助将不胜感激。

编辑:我当前正在使用PS 2.0。

1 个答案:

答案 0 :(得分:2)

除了复制操作( PSv3 + 语法)之外,以下还将旧名称/新名称对输出到TSV文件:

$countRef = [ref] 0
Get-ChildItem -Filter *.pdf -Recurse | ForEach-Object {
  $newFullName = '{0}\{1}.pdf' -f $destLoc, ++$countRef.Value
  Copy-Item -WhatIf -LiteralPath $_.FullName -Destination $newFullName
  [pscustomobject] @{
    Old = $_.FullName
    New = $newFullName
  }
} | Export-Csv -Delimiter "`t" NameMappings.tsv

这将创建一个TSV(制表符分隔值)文件,其中的列名为OldNew分别包含旧的和新的完整文件名。


PSv2 :用于从哈希表创建自定义对象的[pscustomobject] @{ ... }语法糖在v2中不可用,因此必须使用New-Object

$countRef = [ref] 0
Get-ChildItem -Filter *.pdf -Recurse | ForEach-Object {
  $newFullName = '{0}\{1}.pdf' -f $destLoc, ++$countRef.Value
  Copy-Item -WhatIf -LiteralPath $_.FullName -Destination $newFullName
  New-Object PSCustomObject -Property @{
    Old = $_.FullName
    New = $newFullName
  }
} | Export-Csv -Delimiter "`t" NameMappings.tsv

注意事项-Property接受哈希表 [1] ,这意味着不能保证其键顺序,因此结果对象的属性顺序通常不会反映输入顺序-在这种情况下,它只是可能这样做。

如果不希望得到最终的属性顺序,则有两个选择:

  • 缓慢但方便:插入具有所需属性的Select-Object调用(例如Select-Object Old, New)。

  • 更麻烦:首先New-Object PSCustomObject将对象构造为空,然后通过单独的Add-Member调用按所需顺序逐一附加属性。


[1] PSv3 + [pscustomobject] @{ ... }语法似乎也是基于哈希表的,但是它以保留键顺序的方式进行解析。即,就好像您隐式使用了[ordered] @{ ... }