基于文件内容的一行 PowerShell 批量重命名
One Line PowerShell Batch Rename based on File Contents
我有一个包含特定文本的 EDI 文本文件列表。目前,为了让我们的自定义脚本将它们转换为 SQL table,我们需要能够在文件名中看到 X12 文件类型。因为我们使用 SQL 脚本将文件放入 table 中,所以此解决方案需要是单行解决方案。我们有一个客户端文件的定义 table,它指定要查找的字段终止符和文件类型,因此我们稍后会将这些值替换为单独执行的单行解决方案。我目前正在寻找 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'
没有任何变化。
当前错误:
- 第一部分显示重复的路径元素可能是因为文件中有多个交易集Headers,有什么办法可以强制它是唯一的吗?
- 该命令没有显示任何错误(红色文本),但是 whatif 参数显示它没有重命名任何文件(也尝试 运行 它没有重命名)。
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') }
我有一个包含特定文本的 EDI 文本文件列表。目前,为了让我们的自定义脚本将它们转换为 SQL table,我们需要能够在文件名中看到 X12 文件类型。因为我们使用 SQL 脚本将文件放入 table 中,所以此解决方案需要是单行解决方案。我们有一个客户端文件的定义 table,它指定要查找的字段终止符和文件类型,因此我们稍后会将这些值替换为单独执行的单行解决方案。我目前正在寻找 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'
没有任何变化。
当前错误:
- 第一部分显示重复的路径元素可能是因为文件中有多个交易集Headers,有什么办法可以强制它是唯一的吗?
- 该命令没有显示任何错误(红色文本),但是 whatif 参数显示它没有重命名任何文件(也尝试 运行 它没有重命名)。
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') }