如何从文件名中删除空格(批量)
Posted
技术标签:
【中文标题】如何从文件名中删除空格(批量)【英文标题】:How to remove spaces from file names (in bulk) 【发布时间】:2012-07-01 11:55:18 【问题描述】:如何在 Windows 中批量删除数千个文件中的空格(不替换为下划线)?我可以通过 DOS 命令执行此操作吗?
目前:
file one.mp3
file two.mp3
所有文件都需要变成:
fileone.mp3
filetwo.mp3
【问题讨论】:
***.com/questions/9111723/… 可能的答案在这里 @OP 你或许应该接受票数最高的答案。 【参考方案1】:只需复制粘贴到批处理文件并保存为
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
在以下位置添加注册表 ket
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
等)【参考方案2】:
在 Windows 中打开 Powershell,然后在导航到要重命名文件的文件夹后键入以下命令
get-childitem *.mp3 | foreach rename-item $_ $_.Name.Replace(" ", "")
我们来分析一下:
get-childitem *.mp3 这列出了名称以 .mp3 结尾的所有文件。然后使用 | 将它们传送到下一个命令。运算符。
foreach 重命名项目 $_ $_.Name.Replace(" ", "")
这将替换所有“”的实例 (在这种情况下为空格 || 这是要替换的实例) 什么都没有,用“”表示,有效地从所有目录中的文件。
您还可以将 get-childitem *.mp3 修改为 get-childitem - 这将重命名目录中的所有文件,而不仅仅是名称以 .mp3 结尾的文件。
**注意**
如果您不喜欢上述方法,有一个很棒的软件,名为 Bulk Rename Utility。这个软件我个人用过,你可以在youtube上了解很多如何使用它。
【讨论】:
这段代码对我有用!谢谢你拯救了我的一天。 谢谢@Edward Islam【参考方案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.
更多重命名器用法示例here。
【讨论】:
【参考方案4】:在 Windows 中:
-
打开命令提示符。
使用 cd 命令转到文件夹(例如:cd "paht of your folder")。
键入以下命令打开一个 powershell:powershell
然后输入:get-childitem *.mp3 | foreach 重命名项目 $_ $_.name.replace(" ","")
【讨论】:
这是完成工作的简单直接的方法。可读性也很强。非常感谢! 如果有人也想在子目录中递归,在*.mp3
之前添加-Recurse -Include
【参考方案5】:
我遇到的问题是,有可能已经有一个文件与您尝试为新文件指定的名称相同(例如,如果文件夹中有 2 个文件名为“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%
【讨论】:
【参考方案6】:这是一个可以有效地批量重命名文件的脚本,去除名称中的所有空格。
: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: 盘上的所有文件。
【讨论】:
参数不应该是/R
而不是\R
吗?
@Mel - 是的 - 全部修复。谢谢。我还将脚本重命名为合理的名称。我想到了“renameStrip”和“renameNoSpace”,但我的大脑短路并写了“renameNoStrip”。
刚刚来这里是说微软需要将此添加到他们的下一个 Windows 版本中。
为什么 ("%inPath%* *") 中有两个星号?我不熟悉该语言,但会认为它意味着 inPath 中的所有内容,以及当前目录中的所有内容。我将其更改为 ("%inPath%*.myext) 并且可以正常工作。
@Peter - 不,它是单个路径,* *
(星号空格星号)表示至少有一个空格的文件名。这不是必需的,但它会优化脚本,以便它不会浪费时间“重命名”没有空格的文件。【参考方案7】:
创建一个 powershell 文件 - *.ps1
扩展名
写下这段代码:
dir |
Where-Object $_.name.Contains(" ") |
Rename-Item -NewName $_.name -replace " ",""
保存,然后右键->用powershell运行
【讨论】:
这对我来说失败了,因为我认为目录中也有空格并且 dir 命令没有到达那里,我尝试了其他带有 get children 的代码,它可以从目录中的 powershell 命令行工作,所以也可以...与 where 行相同的命令。谢谢【参考方案8】:@echo off
setlocal enableextensions enabledelayedexpansion
for %%f in (*.*) do (
set ARG=%%~nxf
rename "%%f" !ARG: =!
)
【讨论】:
【参考方案9】:您可以编写一个简单的脚本来为一个文件/目录执行此操作,例如:
@echo off
setlocal enableextensions enabledelayedexpansion
set "ARG=%~1"
ren "%ARG%" "%ARG: =%"
...然后,如果您愿意,可以在您关心的所有文件和/或目录上运行它。例如,如果您将上述脚本创建为 myrenamingscript.cmd,您可以通过运行以下命令在当前目录中的所有非目录文件上运行它:
for %f in (*) do @myrenamingscript.cmd "%~f"
【讨论】:
好的,所以我创建了一个名为myrenamingscript.cmd
的文件名,并在其中复制了上面的脚本并将其保存为 .cmd 然后运行它(双击它。?),我做到了不明白你说要使用的最后一部分for....
我提供的脚本将一个给定的文件或目录重命名为相同的名称,但删除了空格。如果要对给定目录中的所有文件执行此操作,则需要对目录中的所有文件运行脚本。最后一条评论是一种方法。以上是关于如何从文件名中删除空格(批量)的主要内容,如果未能解决你的问题,请参考以下文章