单行PowerShell批量重命名基于文件内容

时间:2017-08-17 18:35:29

标签: powershell powershell-v3.0 rename-item-cmdlet

我有一个EDI文本文件列表,其中包含特定文本。目前,为了让我们的自定义脚本将它们转换为SQL表,我们需要能够在文件名中看到X12文件类型。因为我们使用SQL脚本将文件放入表中,所以此解决方案需要是一个单行解决方案。我们有一个客户端文件的定义表,它指定要查找的字段终结符和文件类型,以便稍后将这些值替换为单行执行的单行解决方案。我目前正在研究Powershell(第3版),以实现最大限度的当前和未来兼容性。另外,我对Powershell完全不熟悉,并且已将我的脚本生成基于此论坛的帖子。

文件示例

  • t.text.oxf.20170815123456.out
  • t.text.oxf.20170815234567.out
  • t.text.oxf.20170815345678.out
  • t.text.oxf.20170815456789.out

搜索字符串以在文件中查找:(唯一地查找EDI X12文件类型,可能在同一文件中重复n次)

  • ST * 867
  • ST * 846
  • ST〜867
  • ST〜846
  • ST | 867
  • ST | 846

这是我到目前为止没有用whatif参数做任何事情的事情:

(Get-ChildItem .\ -recurse | Select-String -pattern 'ST~867' -SimpleMatch).Path | Foreach -Begin {$i=1} -Process {Rename-Item -LiteralPath $_ -NewName ($_ -replace 'out$','867.out' -f $i++) -whatif}

第一部分:

(Get-ChildItem .\ -recurse | Select-String -pattern 'ST~867' -SimpleMatch).Path

只需获取我们需要输入以重命名的路径列表

|之后的第二部分管:

Foreach -Begin {$i=1} -Process {Rename-Item -LiteralPath $_ -NewName ($_ -replace '\.out','.867.out' -f $i++) -whatif}

应该遍历该列表并重命名将EDI类型添加到文件末尾的文件。我试过'out$','867.out'但没有改变。

当前错误:

  • 第一部分显示重复的路径元素可能是因为文件中有多个事务集标题,有没有办法强制它是唯一的?
  • 该命令不显示任何错误(红色文本),但使用whatif参数显示它不会重命名任何文件(尝试不用运行它)。

1 个答案:

答案 0 :(得分:1)

1)使用Select-String中的-List开关删除重复项 2)你需要真正将对象传递给for循环

试试这个?

Select-String -Path .\*.out -pattern 'ST~867' -SimpleMatch -List | Select-Object Path | ForEach-Object { Rename-Item $_.path ($_.path -replace 'out$','867.out') }