将字符串插入多个文件名

Mic*_*ael 1 windows powershell

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

Fat1920OVXPlacebo_S20_R1_001.fastq
Kidney1235SHAM_S65_R1_001.fastq
Kidney1911OVXPlacebo_S94_R2_001.fastq
Liver1289OVXEstrogen_S24_R2_001.fastq
Run Code Online (Sandbox Code Playgroud)

我需要在他们的名字中插入字符串“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
Run Code Online (Sandbox Code Playgroud)

我很抱歉,但我绝对没有在 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
Run Code Online (Sandbox Code Playgroud)

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

mkl*_*nt0 6

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

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

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

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

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

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