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

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

我有一个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
  • 圣| 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}
第一部分:

(获取ChildItem.\-recurse |选择字符串-模式'ST~867'-SimpleMatch).路径

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

|管道后的第二部分:

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

将循环遍历该列表并重命名文件,并在文件末尾添加EDI类型。我已经尝试了
“out$”、“867.out”
,没有任何变化

当前错误:
  • 第一部分显示重复的路径元素可能是因为文件中有多个事务集头,有没有办法强制它是唯一的
  • 该命令不显示任何错误(红色文本),但带有whatif参数的命令显示它不重命名任何文件(也尝试在没有重命名的情况下运行该命令)
1)使用选择字符串中的-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') } 

真管用!尽管我不得不将路径更改为:
Select String-path.\*.out-pattern'ST~867'-SimpleMatch-List | Select Object path | ForEach Object{重命名项$\路径($\路径+“.867.out”)}
(from.-to.*out。我以前确实尝试过管道化,但将列表传递到foreach循环时遇到错误。谢谢!我还更改了解决方案,使其与所问问题一致。
Select String-Path.\*.out-pattern'ST~867'-SimpleMatch-list | Select Object Path | foreach Object{Rename Item$\路径($\路径-替换'out$','867.out'))
。我在文件扩展名之前将Rename Item cmdlet的内容从追加更新为替换。是的,很抱歉,在测试命令时,我的路径中有*号。在问题中的路径中替换时,我忘记将其放回。此外,我没有更改命令以匹配所要求的内容。感谢您更正它