Windows 使用原始名称的部分文本重命名文件夹中的文件(批处理文件、powershell、其他解决方案)

Windows 使用原始名称的部分文本重命名文件夹中的文件(批处理文件、powershell、其他解决方案),windows,powershell,batch-file,rename,filenames,Windows,Powershell,Batch File,Rename,Filenames,我有一个包含更多文件的文件夹要重命名 我需要将原始名称的一部分移动到另一个位置 文件名中的所有部分与“-”(第一部分-第三部分-第二部分.gif)分开 所有文件都使用相同的结构 我的原始文件: 111111111 - 333333333 - 2222222222.txt AAAA AAA - CCC CCCC - BBB BBB.mp3 1home - 3home - 2home.jpg 预期结果: 111111111 - 2222222222 - 333333333.txt AAAA AAA

我有一个包含更多文件的文件夹要重命名

我需要将原始名称的一部分移动到另一个位置

文件名中的所有部分与“-”(第一部分-第三部分-第二部分.gif)分开

所有文件都使用相同的结构

我的原始文件:

111111111 - 333333333 - 2222222222.txt
AAAA AAA - CCC CCCC - BBB BBB.mp3
1home - 3home - 2home.jpg
预期结果:

111111111 - 2222222222 - 333333333.txt
AAAA AAA - BBB BBB - CCC CCCC.mp3
1home - 2home - 3home.jpg
所有文件名由三部分组成,我需要将第二部分与第三部分一起移动

不得更改扩展名并保留原始扩展名

任何脚本、软件都将不胜感激

我尝试了此Powershell代码,但似乎不起作用

Set-Location C:\pathHere\

Get-ChildItem | ForEach-Object {
    $artist,$album,$song = $_.BaseName.Split(" - ")
    Rename-Item $_ -NewName ($artist + " - " + $song + " - "  + $album + $_.Extension)
}

在文件夹中运行此命令:

for /f "delims=-. tokens=1,2,3,4"   %i in ('dir /b') do echo rename "%i-%j-%k.%l" "%i-%k-%j.%l">> run-renames.bat
然后,将创建一个脚本文件run renames.bat

 rename "111111111 - 333333333 - 2222222222.txt" "111111111 - 2222222222- 333333333 .txt"
 rename "1home - 3home - 2home.jpg" "1home - 2home- 3home .jpg"
 rename "AAAA AAA - CCC CCCC - BBB BBB.mp3" "AAAA AAA - BBB BBB- CCC CCCC .mp3"
最后运行新脚本。

注意:每次尝试后删除run-renames.bat,这样可以避免包含自身。

我选择将拆分文件名分配给数组。请注意,我使用的是
-Split
。我强烈建议您打开PS会话并键入:
获取有关\u split的帮助
。这将解释您使用拆分输出的所有选项

get-childitem | ForEach-Object { $arr = $_.BaseName -Split(' - ') ; Rename-Item $_ -NewName ($arr[0] + " - " + $arr[2] + " - "  + $arr[1] + $_.Extension) }
这是我运行代码的输出

PS C:\Powershell\rename\data> dir

    Directory: C:\Powershell\rename\data


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2/26/2021   6:07 PM              0 111111111 - 333333333 - 2222222222.txt
-a----        2/26/2021   6:56 PM              0 1home - 3home - 2home.jpg
-a----        2/26/2021   6:56 PM              0 AAAA AAA - CCC CCCC - BBB BBB.mp3


PS C:\Powershell\rename\data> get-childitem | ForEach-Object { $arr = $_.BaseName -Split(' - ') ; Rename-Item $_ -NewName ($arr[0] + " - " + $arr[2] + " - "  + $arr[1] + $_.Extension) }
PS C:\Powershell\rename\data> dir


    Directory: C:\Powershell\rename\data


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2/26/2021   6:07 PM              0 111111111 - 2222222222 - 333333333.txt
-a----        2/26/2021   6:56 PM              0 1home - 2home - 3home.jpg
-a----        2/26/2021   6:56 PM              0 AAAA AAA - BBB BBB - CCC CCCC.mp3


PS C:\Powershell\rename\data>

好的,我真的不想回答OP在使用其标记时没有显示批处理文件编码工作的问题,但这里有一个可能的解决方案:

@Echo Off&SetLocal EnableExtensions DisableDelayedExpansion
对于(“*-*-*.*”)中的%%G,请执行(设置“basenamefore=%%~nG”
SetLocal EnableDelayedExpansion&For/F“Tokens=1-4 Delims=?”%%I In(
“!BaseNameBefore:-=?!”)如果“%%L”==”如果不是%%K==”,则执行EndLocal(&I)(
任“%%G”“%%I-%%K-%%J%%~xG”))

由于没有显示任何编码工作,我将让您自己详细分析代码的工作原理,而不需要我的解释。

使用PowerShell,我会这样做:

(Get-ChildItem -Path 'D:\Test' -File -Filter '*-*-*.*') | 
    Rename-Item -NewName { $parts = ($_.BaseName -split '-').Trim()
                           '{0} - {1} - {2}{3}' -f $parts[0], $parts[2], $parts[1], $_.Extension
                         }
Get ChildItem
与开关
-File
-Filter
一起返回文件的FileInfo对象数组,这些文件有3个由连字符分隔的文本块(
'*-*-*.'
),因此我们可以确保这些名称可以分为三部分

然后,此操作的结果通过管道发送到cmdlet
重命名项
,它可以在参数
-NewName
中使用scriptblock。 在该脚本块中,只需将每个文件的基本名称拆分为(修剪过的)单独的部分,然后以不同的顺序将这些部分合并回新文件名。(我喜欢使用
-f
格式操作符来处理类似的事情,因为它可以生成非常可读的代码)

之前

D:\TEST
    111111111 - 333333333 - 2222222222.txt
    1home - 3home - 2home.jpg
    AAAA AAA - CCC CCCC - BBB BBB.mp3
之后

D:\TEST
    111111111 - 2222222222 - 333333333.txt
    1home - 2home - 3home.jpg
    AAAA AAA - BBB BBB - CCC CCCC.mp3
(Get-ChildItem-Path'D:\Test'-File-Filter'*-*-*.*)
应该放在括号中的原因是,否则,Get-ChildItem cmdlet可以在迭代文件夹时拾取已重命名的文件,从而多次重命名这些文件。
括号确保在通过管道发送文件之前完成文件收集


注意如评论所述,如果您确定拆分应该在
空格连字符空格上进行,只需将
-split'-'
更改为
-split'-'

第一个和第三个文件显示为五部分,第二个文件显示为八部分,使用标准的可接受字符串分隔符(空格),所以他们都没有三个部分!如果你的问题真的是,任何脚本、软件都可以这样做,那么你是否意识到在“为什么应该关闭这个问题”的社区原因下,在“为什么这个问题不适合堆栈溢出?”下,有一个选项是“寻找书籍、工具、软件库等的建议”?您是否已阅读了,并通读了?@Compo Separator始终为“-”下的所有页面,如果您看到所有文件名始终有3个部分。第一部分-第二部分-第三部分好的,如果空格不是分隔符,连字符是,那么您的预期结果仍然是错误的,它们将读取,
111111111-222222-333333333.txt
AAAA-BBB-BBB-ccccccccc.mp3
,和
1home-2home-3home.jpg
。显然,空格和连字符不能被视为分隔符,那么您是在告诉我们basename部分是由一系列的字符分隔的吗?你能不能明确地说,任何文件名中都不会有连字符,而这些文件名不是三个字符序列的一部分?你不需要设置位置来获取子项。你认为他们需要在文件名的第三部分之后,扩展名之前留一个空格吗?我认为这个空格属于第二段(现在移动到第三位置)。可能用户更愿意保留它。其他选项可能是,如果您计划只运行一次,则可以使用记事本++或升华编辑和更正新脚本。请重新阅读用户的问题。他们清楚地定义了输入文件名和输出文件名。他们不希望在文件扩展名前留有空格。我尝试了但不执行任何操作此脚本此代码不执行任何操作“for/f”delims=-.tokens=1,2,3,4”%i in('dir/b')执行回显重命名“%i-%j-%k.%l”%i-%k-%j.%l“>>运行renames.bat”没有创建批处理文件我喜欢你添加了修剪,以防在连字符之前或之后有多个空格,但我仍然认为你需要使用字符串空格连字符空格进行拆分。他们确实明确表示这是应该拆分的。如果用户有文件名:
1111-AAAA-2222,则结果将不理想22222-333333.txt
@Squashman谢谢,我在回答中添加了一个注释。我尝试了,但什么也没做,为什么每个Powershell代码在我的电脑上都不工作?@cicoria我不知道该告诉你什么。这个代码也可以在我的电脑上使用您提供的文件名示例。@cicoria Powershell代码必须与Powershell一起运行。@cicoria Powershell您正试图从cmd控制台窗口运行它?尝试过,不重命名任何内容,似乎不起作用。@cico