如何通过Windows批处理操作递归地替换名称

3
我希望在一个大目录中进行批处理操作。实际上,我已经有了该过程的批处理脚本。但是在这里,我遇到了一个问题。一些目录名称和文件名称包含空格字符。因此,在批处理操作中,这些名称将作为2个参数传递,并且这些行将无法工作。所以我想将" "重命名为"_"以解决这个问题。
例如: process /MyDirectory/Ola and Me/Private/TopSecretPictures/
这会导致错误。下面的命令可以正常工作: process /MyDirectory/Ola and Me/Private/TopSecretPictures
我的目标是:递归地将| Ola and Me |>> |Ola_And_Me|进行转换。
:)
提前感谢您的帮助。

你尝试过使用 process "/MyDirectory/Obama and Me/Private/TopSecretPictures/" 吗? - Etan
为符合部门的新命名标准,我必须更改所有目录名称。 - Yaya
2个回答

6
以下脚本会递归重命名给定目录下的所有文件和目录,并将空格转换为下划线。 spaces_to_underscores.bat 脚本如下:
@echo off
setlocal

for /r "%~1" %%t in (.) do (
   for /f "usebackq tokens=*" %%f in (`dir /b/a-d "%%~t" 2^>nul:`) do (
      call :proc "%%~f" "%%~t"
   )
   for /f "usebackq tokens=*" %%d in (`dir /b/ad "%%~t" 2^>nul:`) do (
      call :proc "%%~d" "%%~t"
   )
)
exit /b 0

:proc
   set fn=%~1
   if "%fn: =_%"=="%fn%" exit /b 0
   set fn=%~2\%fn: =_%
   move "%~2\%~1" "%fn%" >nul:
exit /b 0

使用方法:

spaces_to_underscores "My Directory"

考虑到以下的目录结构

My Directory
    Ola and Me
        Private
            TopSecretPictures

它将重命名文件夹 "Ola and Me" 为 "Ola_and_Me", 并且还会将任何文件,如 "Photo 001.jpg" 重命名为 "Photo_001.jpg"。起始目录 "My Directory" 不会被重命名。

警告:不要在标准 Windows 目录(例如 "C:\Documents and Settings" 或 "C:\Program Files" 或 "My Documents" 或 "Application Data")上运行此脚本。这里没有“撤消”功能。确保您有备份。


2

如果您使用默认情况下未开启的“延迟扩展”功能,可以在批处理文件中执行此操作。要启用它,您需要使用/v开关启动cmd.exe:

cmd.exe /v

一旦启用,以下批处理脚本将把%%i中的所有空格替换为下划线,并输出结果:

for /f "usebackq tokens=*" %%i in (`dir /b`) do (
    set S=%%i
    set T=!S: =_!
    echo !T!
)

***模糊的描述...***除了for循环本身,此脚本的有趣部分包括:

  • 使用%var:str1=str2%语法进行字符串替换
  • 使用!var!而不是%var%进行延迟扩展

首先:延迟扩展... 如果没有这个功能,命令解释程序(出于任何原因,Microsoft决定将其编码)将先评估所有参数,然后运行脚本:因此,这个版本的脚本无法工作

for /f "usebackq tokens=*" %%i in (`dir /b`) do (
    set S=%%i
    set T=%S: =_%
    echo %T%
)

这个版本中,变量“T”在实际执行(...)块内容之前被设置为for循环的最后一个值,这对我来说毫无意义。因此,启用延迟执行后,我们可以使用延迟执行变量标记,即!var!而不是%var%。这样就能得到正确的结果。
另一个聪明的地方是set T=!S: =_!(基本上是将T设置为S,并将S中的每个'' '替换为' _')。如果没有启用延迟执行,这将被写成set T=%S: =_%

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