如何在目录树中递归地用所有文件和文件夹名称中的下划线替换所有空格?

时间:2018-08-29 00:37:16

标签: windows batch-file cmd directory rename

How to replace all spaces by underscores in all file names of a folder?
它包含的解决方案可以通过用下划线替换空格来重命名文件夹中具有一个或多个空格的所有文件。

如何递归重命名包括该文件的每个目录名的整个路径,而不只是文件名本身?

例如,当前目录为C:\example,其中包含:

C:\example\some stupid file path with whitespace\my file.exe
C:\example\another stupid whitespaced dir\another file.exe

文件夹和文件应重命名为:

C:\example\some_stupid_file_path_with_whitespace\my_file.exe
C:\example\another_stupid_whitespaced_dir\another_file.exe

如何对递归文件和文件夹进行重命名?

1 个答案:

答案 0 :(得分:1)

这是此任务的批处理代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "StartFolder=C:\example"

cd /D %SystemRoot%
set "RenameError="

rem Rename all files containing at least one space character in file name.
for /F "delims=" %%I in ('dir "%StartFolder%\* *" /A-D /B /S 2^>nul') do call :RenameFile "%%I"

rem Rename all folders containing at least one space character in folder name.
for /F "delims=" %%I in ('dir "%StartFolder%\* *" /AD /B /S 2^>nul') do call :RenameFolder "%%I"

if defined RenameError echo/& pause
rem Restore initial environment and exit this batch file.
endlocal
goto :EOF


:RenameFile
set "NewFileName=%~nx1"
set "NewFileName=%NewFileName: =_%"

set "FileAttributes=%~a1"
if "%FileAttributes:~3,1%" == "h" %SystemRoot%\System32\attrib.exe -h %1

ren %1 "%NewFileName%" 2>nul
if errorlevel 1 goto ErrorFileRename

if "%FileAttributes:~3,1%" == "h" %SystemRoot%\System32\attrib.exe +h "%~dp1%NewFileName%"
goto :EOF

:ErrorFileRename
echo Error renaming file %1
set "RenameError=1"
if "%FileAttributes:~3,1%" == "h" %SystemRoot%\System32\attrib.exe +h %1
goto :EOF


:RenameFolder
set "NewFolderName=%~nx1"
set "NewFolderName=%NewFolderName: =_%"

set "FolderPath=%~dp1"
if not exist "%FolderPath%" set "FolderPath=%FolderPath: =_%"
set "FullFolderName=%FolderPath%%~nx1"
if not exist "%FullFolderName%\" set "RenameError=1" & goto :EOF

for %%J in ("%FullFolderName%") do set "FolderAttributes=%%~aJ"
if "%FolderAttributes:~3,1%" == "h" %SystemRoot%\System32\attrib.exe -h "%FullFolderName%"

ren "%FullFolderName%" "%NewFolderName%" 2>nul
if errorlevel 1 goto ErrorFolderRename

if "%FolderAttributes:~3,1%" == "h" %SystemRoot%\System32\attrib.exe +h "%FolderPath%%NewFolderName%"
goto :EOF

:ErrorFolderRename
echo Error renaming folder "%FullFolderName%"
set "RenameError=1"
if "%FolderAttributes:~3,1%" == "h" %SystemRoot%\System32\attrib.exe +h "%FullFolderName%"
goto :EOF

它也适用于隐藏的文件和文件夹,以及包含全限定文件/文件夹名称中带有感叹号的文件和文件夹。

如果由于以下原因重命名文件或文件夹失败,则批处理文件将输出一条错误消息:

  1. 同一文件夹中的现有文件/文件夹已经具有新的文件/文件夹名称。
  2. 使用的用户帐户没有重命名文件/文件夹所需的权限。
  3. 要重命名的文件夹是任何正在运行的进程的当前目录。
  4. 要重命名的文件是由正在运行的进程打开的,该进程具有该进程设置的文件访问权限,从而防止了重命名打开的文件。
  5. 正在重命名的文件夹中的文件或其子文件夹之一由正在运行的进程打开,该进程具有由该进程设置的文件访问权限,从而防止了文件的重命名或删除,这也导致了此路径中任何文件夹的重命名或删除打开的文件。

如果发生任何文件/文件夹重命名错误,则批处理文件将在末尾暂停,以便用户双击该批处理文件可以读取错误消息。如果在执行过程中未发生重命名错误,则不会暂停。

批处理文件不会尝试重命名尽可能多的名称中带有空格的文件夹。因此,例如,如果无法重命名具有至少一个名称空间的2级文件夹,则也不会重命名具有4级及以下名称的空间的所有子文件夹。批处理文件仅包含处理以下情况的代码:包含当前文件夹的一个或多个空格的路径中的任何文件夹之前都无法重命名。在这种情况下,它将尝试使用文件夹名称中的空格重命名当前子文件夹。

批处理文件将正在运行的命令进程的当前目录临时设置为Windows目录,以确保当前命令进程不会阻止重命名文件夹树中的文件夹。

批处理文件的文件名中不应包含空格,并且不应位于分配给环境变量StartFolder的文件夹的子文件夹之一中。在开始文件/文件夹重命名过程之前,没有添加代码来验证这两个要求。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • attrib /?
  • call /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • ren /?
  • set /?
  • setlocal /?

另请参阅:

在Windows命令解释器执行之前,重定向操作符>必须在两个 FOR 命令行上都使用脱字符号^进行转义,才能被解释为文字字符。命令 FOR ,它在以dir为背景的独立命令过程中执行嵌入的cmd.exe /C命令行。