首页 > 解决方案 > 将字符串插入多个文件名

问题描述

我有多个以这种格式命名的文件:

Fat1920OVXPlacebo_S20_R1_001.fastq
Kidney1235SHAM_S65_R1_001.fastq
Kidney1911OVXPlacebo_S94_R2_001.fastq
Liver1289OVXEstrogen_S24_R2_001.fastq

我需要在他们的名字中插入字符串“L1000_”,以便他们阅读

Fat1920OVXPlacebo_S20_L1000_R1_001.fastq
Kidney1235SHAM_S65_L1000_R1_001.fastq
Kidney1911OVXPlacebo_S94_L1000_R2_001.fastq
Liver1289OVXEstrogen_S24_L1000_R2_001.fastq

我很抱歉,但我绝对没有在 powershell 中编码的经验。我能找到的最接近的方法是重命名整个文件的脚本:

Set objFso = CreateObject(“Scripting.FileSystemObject”)

Set Folder = objFSO.GetFolder(“ENTER\PATH\HERE”)

For Each File In Folder.Files

    sNewFile = File.Name

    sNewFile = Replace(sNewFile,”ORIGINAL”,”REPLACEMENT”)

    if (sNewFile<>File.Name) then

        File.Move(File.ParentFolder+”\”+sNewFile)

    end if

Next

但是,我只需要在文件标题的特定位置插入一个字符串。我有 257 个文件,不想一个一个地去。有人知道如何在 Windows 中运行它吗?

标签: windowspowershell

解决方案


用于Get-ChildItem枚举感兴趣的文件,将它们通过管道传输到Rename-Item,并使用延迟绑定脚本块( { ... }) 通过基于正则表达式的-replace操作动态确定新名称。

(Get-ChildItem $yourFolder -Filter *.fastq) |
  Rename-Item -NewName { $_.Name -replace '(?<=_S\d+_)', 'L1000_' } -WhatIf

注意:
•上述命令中的-WhatIfcommon 参数用于预览操作。-WhatIf 一旦您确定该操作将执行您想要的操作,请删除。
• 即使在这种情况下不是绝对必要的,将Get-ChildItem命令括在 中(...)分组运算符确保已经重命名的文件不会意外地重新进入要重命名的文件的枚举 - 请参阅此答案

  • (?<=_S\d+_)使用肯定的后向断言 ( (?<=...)) 来匹配逐字字符串_S,后跟一个或多个 ( +) 数字 ( \d),然后是逐字_

  • 由于后视断言仅匹配字符串中的位置而不是子字符串,因此在这种情况下,替换操作数(L1000_在这种情况下逐字逐句)插入到输入字符串(的副本)中的该位置。

  • 有关延迟绑定脚本块技术的更详细说明,请参阅此答案


推荐阅读