如何批量删除文件名中的空格

35

如何在Windows中批量删除数千个文件中的空格(不用下划线替换)?我能从DOS命令中完成吗?

当前:

file one.mp3
file two.mp3

所有文件都需要变成:

fileone.mp3
filetwo.mp3

可能的答案在这里:http://stackoverflow.com/questions/9111723/dos-batch-file-titlecase-and-remove-special-characters - JohnP
@OP 你或许应该接受得票最高的答案。 - Shashank Sawant
9个回答

93

这是一段可以高效地批量重命名文件的脚本,可以删除名称中的所有空格。

:renameNoSpace  [/R]  [FolderPath]
@echo off
setlocal disableDelayedExpansion
if /i "%~1"=="/R" (
  set "forOption=%~1 %2"
  set "inPath="
) else (
  set "forOption="
  if "%~1" neq "" (set "inPath=%~1\") else set "inPath="
)
for %forOption% %%F in ("%inPath%* *") do (
  if /i "%~f0" neq "%%~fF" (
    set "folder=%%~dpF"
    set "file=%%~nxF"
    setlocal enableDelayedExpansion
    echo ren "!folder!!file!" "!file: =!"
    ren "!folder!!file!" "!file: =!"
    endlocal
  )
)

假设脚本名为 renameNoSpace.bat

renameNoSpace : (无参数)重命名当前目录中的文件。

renameNoSpace /R : 重命名以当前目录为根的目录树中的文件。

renameNoSpace myFolder : 重命名在当前目录中找到的“myFolder”目录中的文件。

renameNoSpace "c:\my folder\" : 重命名指定路径中的文件。使用引号因为路径包含空格。

renameNoSpace /R c:\ : 重命名C驱动器上的所有文件。


1
参数不应该是\R而是/R吗? - Mel
1
@Mel - 是的 - 问题已经解决。谢谢。我还将脚本重命名为一个合理的名称。我原本想到了"renameStrip"和"renameNoSpace",但我的大脑短路了,写成了"renameNoStrip"。 - dbenham
1
我只是来这里说微软需要在他们的下一个Windows版本中添加这个功能。 - xhermit
2
@Peter - 不,这是一个单一的路径,而 * *(星号空格星号)代表至少有一个空格的文件名。虽然不是必需的,但它可以优化脚本,使其不浪费时间“重命名”没有空格的文件。 - dbenham
@dbenham - 太好了。我只需要修改特定扩展名的名称。这使得(“%inPath%* *.myext”)。而且我需要将空格更改为其他字符,比如插入符号,这使重命名行变为:ren“!folder!!file!”“!file: = ^!” 。它也可以使用+。插入符号似乎是一个转义字符,但在这种情况下不是。 - Peter
显示剩余3条评论

30

在Windows中:

  1. 打开命令提示符。
  2. 使用cd命令进入文件夹(例如:cd "您的文件夹路径")。
  3. 键入powershell打开PowerShell。
  4. 然后输入以下内容:get-childitem *.mp3 | foreach {rename-item $_ $_.name.replace(" ","")}

这是一种简单直接的完成工作的方式。非常易读。非常感谢! - Tejas Anil Shah
1
如果有人想要在子目录中递归地执行此操作,只需在 *.mp3 之前添加 -Recurse -Include 即可。 - Viktor Brešan

13
创建一个PowerShell文件 - 扩展名为*.ps1 编写以下代码:
dir |
Where-Object { $_.name.Contains(" ") } |
Rename-Item -NewName { $_.name -replace " ","" }

保存后,右键点击 -> 使用 PowerShell 运行


这对我失败了,因为我认为目录中也有空格,dir命令无法到达那里,我尝试了其他使用get children的代码,在PowerShell命令行中在目录中工作,所以...相同的命令与where行一起使用。谢谢。 - bandybabboon
它对我有效。如何重命名所有子文件夹? - sabithkumar

7

在Windows中打开Powershell,然后在导航到要重命名文件的文件夹后,输入以下命令。

get-childitem *.mp3 | foreach { rename-item $_ $_.Name.Replace(" ", "") }

让我们分析一下:

get-childitem *.mp3 这个命令列出所有文件名以 .mp3 结尾的文件,然后使用 | 运算符将它们传输到下一个命令。

foreach { rename-item $_ $_.Name.Replace(" ", "") }

这个命令将所有实例中的 " " (在这种情况下是空格||这是要替换的实例) 用 "" 替换,从而有效地从目录中所有文件中删除该单词。

您还可以修改 get-childitem *.mp3 为 get-childitem - 这将重命名目录中的所有文件,而不仅仅是以 .mp3 结尾的文件。

** 注意 **

如果您不喜欢上述方法,有一个很棒的软件叫做批量重命名实用程序。我个人使用过这个软件,您可以在YouTube上获得许多教程来使用它。


这段代码对我很有效!谢谢,你救了我的一天。 - rtraees
谢谢@Edward Islam - Sachin
我认为这是最简单和最快的。 - John

4
@echo off
setlocal enableextensions enabledelayedexpansion

for %%f in (*.*) do (
set ARG=%%~nxf
rename "%%f" !ARG: =!
)

4
你可以编写一个简单的脚本来处理一个文件/目录,例如:

您可以编写一个简单的脚本来处理一个文件/目录,例如:

@echo off
setlocal enableextensions enabledelayedexpansion

set "ARG=%~1"
ren "%ARG%" "%ARG: =%"

如果您愿意,可以将它运行到您关心的所有文件和/或目录中。例如,如果您将上述脚本创建为myrenamingscript.cmd,则可以通过运行以下命令将其应用于当前目录中的所有非目录文件:

for %f in (*) do @myrenamingscript.cmd "%~f"

好的,我已经创建了一个名为myrenamingscript.cmd的文件,并在其中复制了上面的脚本并将其保存为.cmd,然后运行它(双击它.?),但是我不明白你最后说的使用for...部分。 - Nick Kahn
我提供的脚本将给定的文件或目录重命名为相同的名称,但删除了空格。如果您想对给定目录中的所有文件执行此操作,则需要在目录中运行脚本。最后的注释是一种实现这个目标的方法。 - reuben

3

由于编程重命名文件存在风险(如果操作不当可能会导致破坏性结果),因此我建议使用专门用于批量重命名的带有干运行模式的工具,例如renamer

此命令从当前目录中的所有文件中删除空格:

$ renamer --find "/\s/g" --dry-run *

Dry run

✔︎ file one.mp3 → fileone.mp3
✔︎ file two.mp3 → filetwo.mp3

Rename complete: 2 of 2 files renamed.

这里有更多的重命名使用示例


0
我所面临的问题是:当你尝试给新文件命名时,有可能已经有一个同名文件存在(例如,如果文件夹中有两个文件分别命名为“file one.txt”和“file_one.txt”,那么在你试图用下划线替换空格时,一个文件会替换另一个文件)。因此,我写了这个脚本,它会检查新名称是否已经存在,如果是,则在文件名后面添加一个数字(每次加1,直到没有其他同名文件)。有关要更改哪些内容的说明在顶部(被注释掉的行)。如果你使用*.*选项,请不要将批处理文件存储在与待重命名文件相同的文件夹中。希望这可以帮到你。
@echo off

REM Instructions
REM This script repaces spaces from file names with underscores. 
REM If you want to just remove the spaces uncomment lines 30 and 52 and comment out the lines 29 and 51. 
REM set the following parameters. 
REM pb is the folder containing the files we want to rename (fullpath)
REM tm is a temporary folder that will be created and deleted. Just put a folder that does not exist and is not used by anything else (fullpath).
REM all is the file type you want to raname. E.g. *.* for every file, *.txt for TXTs, *.pdf for PDFs etc 
REM you don't have to change anything else

set pb=<folder containing the files to rename>
set tm=<a temp folder that does not exist>
set all=*.*

set pa=%pb%%all%

setlocal EnableDelayedExpansion

cd /d %pa%

set /a count=1

if not exist %tm% mkdir %tm%

for /f %%F in (%pa%) do (

    set name=%%~nF
    set name2=!name: =_!
    REM set name2=!name: =!
    set name3=!name2!%%~xF

    if !name2! == %%~nF ( 
        move /y %%~dpF\!name3! %tm%\ >nul
    ) else (
            if not exist %%~dpF\!name3! ( 
                if not exist %tm%\!name3! (
                    ren "%%F" "!name3!" 
                    move /y %%~dpF\!name3! %tm%\ >nul
                )
        )   
    ) 

)

:rename

for /f %%F in (%pa%) do (

    set name=%%~nF
    set name2=!name: =_!
    REM set name2=!name: =!
    set name4=!name2!%count%
    set name3=!name4!%%~xF

    if !name2! == %%~nF ( 
        move /y %%~dpF\!name3! %tm%\ >nul
    ) else (
            if not exist %%~dpF\!name3! ( 
                if not exist %tm%\!name3! (
                    ren "%%F" "!name3!" 
                    move /y %%~dpF\!name3! %tm%\ >nul
                )
        )   
    ) 

)

set /a count = %count% + 1

set /a loop = 0

for %%F in (%pa%) do (set /a loop = 1)

if %loop% equ 1 goto rename

move /y %tm%\%all% %pb% >nul

rmdir /s /q %tm%

0
只需将此内容复制并粘贴到批处理文件中,然后另存为c:\myfolder\r.bat
setlocal EnableDelayedExpansion
@echo off &cls
set p=%*
set p=!p: =!
set p=!p:^(=!
set p=!p:^)=!
set p=!p:^[=!
set p=!p:^]=!
set p=!p:^$=!
set p=!p:^&=!
set p=!p:^@=!
set p=!p:^;=!
set p=!p:^:=!
set p=!p:^,=!
set p=!p:^#=!
set p=!p:^_=!
set p=!p:^-=!
set e=%p:~-4%
ren "%*" %time:~6,2%%time:~9,2%%e%
exit

在注册表中添加一个键

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\#myRENAME]
@=""

[HKEY_CLASSES_ROOT\*\shell\#myRENAME\command]
@="c:\myfolder\r.bat \"%1\""

完成了,现在选择文件并右键选择myRENAME,所有文件将立即重命名。


哎呀 - 检查一下你的逻辑!(另外,文件扩展名并不总是三个字母 - 想想 .html.xlsx 等等。) - Stephan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接