【问题标题】:Piping Powershell output to a text file将 Powershell 输出通过管道传输到文本文件
【发布时间】:2019-01-24 17:02:59
【问题描述】:

我有以下 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。

【问题讨论】:

    标签: powershell csv powershell-2.0


    【解决方案1】:

    除了复制操作(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] @{ ... }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      相关资源
      最近更新 更多