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

One Line PowerShell Batch Rename based on File Contents

我有一个包含特定文本的 EDI 文本文件列表。目前,为了让我们的自定义脚本将它们转换为 SQL table,我们需要能够在文件名中看到 X12 文件类型。因为我们使用 SQL 脚本将文件放入 table 中,所以此解决方案需要是单行解决方案。我们有一个客户端文件的定义 table,它指定要查找的字段终止符和文件类型,因此我们稍后会将这些值替换为单独执行的单行解决方案。我目前正在寻找 Powershell (v.3) 来实现最大的当前和未来兼容性。另外,我是 Powershell 的新手,我的脚本生成基于此论坛中的帖子。

文件示例

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

这是我到目前为止没有显示自己对 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' 没有任何变化。

当前错误:

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') }