通过切换名称的两个部分批量重命名文件

通过切换名称的两个部分批量重命名文件

我是新手,没有任何编码知识或经验或软件,但我使用 Windows 10。我有很多文件,名称如下:
(1) 2020-03-12.mp3
(7) 2021-04-10.mp4
(6) 2022-08-25.docx
等。

它们主要是 mp4、mp3、jpg、pdf、docx、xlsx。我想切换这些元素,所以像第一个元素将被命名为:
2020-03-12 (1).mp3

你能帮忙吗,谢谢 x

答案1

这是完成这项工作的一种方法...... [咧嘴笑]

代码 ...

$TopDir = $env:TEMP

#region >>> make some files to work with
#    when ready to use the real items, remove the entire "#region/#endregion" block
@'
(1) 2020-03-12.mp3
(7) 2021-04-10.mp4
(6) 2022-08-25.docx
'@ -split [System.Environment]::NewLine |
    ForEach-Object {
        # the "$Null =" is to supress unwanted output from the cmdlet
        $Null = New-Item -Path $TopDir -Name $_ -ItemType 'File' -Force
        }
#endregion >>> make some files to work with

$FileList = Get-ChildItem -LiteralPath $TopDir -Filter '(*)*.*'

foreach ($FL_Item in $FileList)
    {
    $NewBaseName = $FL_Item.BaseName -replace '^(.+)\s(.+)$', '$2 $1'
    $NewName = -join ($NewBaseName, $FL_Item.Extension)

    # remove the "-WhatIf" to make actual changes
    Rename-Item -Path $FL_Item.FullName -NewName $NewName -WhatIf
    }

它能做什么 ...

  • 设置要工作的源目录

  • 按原样测试后,创建一组要处理的文件,只需删除整个#region/#endregion块并将其设置$TopDir为目标文件夹。
  • 获取以以下项开头的文件列表(*)
  • 遍历该列表
  • 通过捕获两个部分并交换它们来为文件创建一个新的 BaseName
  • 通过连接新的 BaseName 和旧的来构建新的文件名.Extension
  • 重命名文件
    此脚本的当前版本不会重命名任何内容...当您准备测试时,请删除或注释掉-WhatIf重命名行末尾的参数。

输出与-WhatIf...

What if: Performing the operation "Rename File" on target "Item: C:\Temp\(1) 2020-03-12.mp3 Destination: C:\Temp\2020-03-12 (1).mp3".
What if: Performing the operation "Rename File" on target "Item: C:\Temp\(6) 2022-08-25.docx Destination: C:\Temp\2022-08-25 (6).docx".
What if: Performing the operation "Rename File" on target "Item: C:\Temp\(7) 2021-04-10.mp4 Destination: C:\Temp\2021-04-10 (7).mp4".

答案2

在 PowerShell 中,操作 Cmdlet 将是Rename-Item

要构造新名称,您可以从基名称的财产系统.IO.文件信息返回的对象获取子项

使用该Split方法,BaseName 可以通过<Space>字符进行拆分,返回一个双元素字符串数组:

PS C:\>>'(1) 2020-03-12'.Split(' ')
(1)
2020-03-12
PS C:\>

要“组装”新名称,有几种选择,但我建议-f(格式运算符),这样可以明确区分常量元素和变量元素。

因此,使用管道中的当前对象构造新名称的 ScriptBlock 将如下所示:

{ '{1} {0}{2}' -f ( $_.BaseName.Split(' ') + $_.Extension )}

因此,如果我们将该 scfiptblock 分配给一个变量,我们可以在重命名操作中使用它。假设当前目录中的所有文件都遵循命名格式并且需要重命名,那么这两行就可以解决问题:

$NewNameLogic = { '{1} {0}{2}' -f ( $_.BaseName.Split(' ') + $_.Extension )}
Get-ChildItem -File | Rename-Item -NewName $NewNameLogic

答案3

@echo off && cd /d "%~dp0"

for /f delims^= %%i in =;('where .:(*.*^|find /v "%~0"')do set "_name=%%~ni" & =;(
   cmd.exe /v /c "rename "%%~fi" "%%_name:* =%% !_name: %%_name:* =%%=!%%~xi"" );=

您可以尝试使用:

:: [ Replace Variable: (From Substring: Replace Variable = To Noting ) = To Nothing ] ::

:: define variable
>set "_var=(1) 2020-03-12" 

:: remove all before the first space            
>echo %_var:* =% 
2020-03-12

:: remove the inverse of [remove all before the first space]
>cmd /v /c "echo;!_var: %_var:* =%=!"
(1)

:: join the two replaces you have destination name
>cmd.exe /v /c "echo;!_var:* =! !_var: %_var:* =%=!.mp3"
2020-03-12 (1).mp3

相关内容