【问题标题】:Insert string into multiple filenames将字符串插入多个文件名
【发布时间】:2021-03-15 21:45:07
【问题描述】:

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

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 中运行它吗?

【问题讨论】:

  • 你找到的脚本是VBScript,不是PowerShell..

标签: windows powershell


【解决方案1】:

使用Get-ChildItem 枚举感兴趣的文件,将它们通过管道传送到Rename-Item,并使用delay-bind script block ({ ... }) 通过基于正则表达式的-replace operation 动态确定新名称。

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

注意:
• 以上命令中的-WhatIf common parameter 预览 操作。一旦您确定该操作会执行您想要的操作,请删除 -WhatIf
• 尽管在这种情况下并非绝对必要,但将Get-ChildItem 命令包含在(...) 中,grouping operator 可确保已重命名的文件不会意外地重新输入要重命名的文件的枚举- 参见this answer

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

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

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

【讨论】:

    【解决方案2】:

    这是使用 PoSh 的一种方法。请注意,该演示不处理重命名或目录相关的东西。它只处理生成新文件名。

    它的作用...

    • 虚假读取文件信息对象列表
      当准备好真正执行此操作时,将整个 #region/#endregion 块替换为对 Get-ChildItem 的调用并将其保存到 $FileList
    • 设置要插入的文本
    • 遍历文件列表
    • 在下划线处分割文件.Name属性
    • 将其保存到 $Var
    • 将第一个两个拆分、插入文本和最后两个拆分添加到一个新数组中
    • 使用下划线作为分隔符连接该数组
    • 将新文件名发送到$Result 集合
    • 显示新名称列表

    代码...

    #region - fake reading in a list of files
    #    in real life, use Get-ChildItem
    $FileList = @(
        [system.io.fileinfo]'Fat1920OVXPlacebo_S20_R1_001.fastq'
        [system.io.fileinfo]'Kidney1235SHAM_S65_R1_001.fastq'
        [system.io.fileinfo]'Kidney1911OVXPlacebo_S94_R2_001.fastq'
        [system.io.fileinfo]'Liver1289OVXEstrogen_S24_R2_001.fastq'
        )
    #endregion - fake reading in a list of files
    
    
    $InsertionText = 'L1000'
    
    $Result = foreach ($FL_Item in $FileList)
        {
        $FLI_Parts = $FL_Item.Name.Split('_')
        ($FLI_Parts[0,1] + $InsertionText + $FLI_Parts[2,3]) -join '_'
        }
    
    $Result
    

    输出...

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

    【讨论】:

      【解决方案3】:

      使用 PowerShell,您可以使用正则表达式来重命名文件。示例:

      Get-ChildItem "C:\foldername\here\*.fastq" | ForEach-Object {
        $oldName = $_.Name
        $newName = [Regex]::Replace($oldName,'(S\d+)_(R\d+)','$1_L1000_$2')
        Rename-Item $_ $newName -WhatIf
      }
      

      [Regex] 是 .NET Regex 类的 PowerShell 类型加速器Replace 是执行文本的 Regex 类的方法换人。 Replace 方法的第一个参数是输入字符串(旧文件名),第二个参数是正则表达式模式(运行help about_Regular_Rxpressions 以获取更多信息),第三个参数是替换字符串模式,其中@987654328 @ 是( ) 中的第一个捕获模式,$2( ) 中的第二个捕获模式)。最后,Rename-Item cmdlet 重命名文件。如果输出看起来正确以实际执行重命名,请删除 -WhatIf 参数。

      【讨论】:

        猜你喜欢
        • 2013-01-15
        • 1970-01-01
        • 1970-01-01
        • 2015-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        相关资源
        最近更新 更多