2

我有一个包含特定文本的 EDI 文本文件列表。目前,为了让我们的自定义脚本将它们转换为 SQL 表,我们需要能够在文件名中看到 X12 文件类型。因为我们使用 SQL 脚本将文件放入表中,所以这个解决方案需要是一个单行解决方案。我们有一个客户端文件的定义表,其中指定了要查找的字段终止符和文件类型,因此我们稍后会将这些值替换为要单独执行的单行解决方案。我目前正在考虑使用 Powershell (v.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 参数显示它没有重命名任何文件(也尝试在没有的情况下运行它)。
4

1 回答 1

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') } 
于 2017-08-17T19:11:42.713 回答