【问题标题】:how to replace names recursively via windows batch operation如何通过Windows批处理操作递归替换名称
【发布时间】:2009-10-23 13:58:04
【问题描述】:

我想在一个大目录中处理一个批处理操作。实际上我有那个过程的批处理脚本。但是在这里,我有一个问题。一些目录名、文件名中包含“”(空格字符)。因此,在批处理操作中,这些名称作为 2 个参数传递。这些行将不起作用。所以我想用“_”重命名“”来解决这个问题。

例子:

进程/MyDirectory/Ola and Me/Private/TopSecretPictures/

这会产生错误。下面的工作正常

处理 /MyDirectory/Ola and Me/Private/TopSecretPictures

我的目标是:转换 | Ola 和我 |>> |Ola_And_Me 递归

:)

提前谢谢..

【问题讨论】:

  • 你试过process "/MyDirectory/Obama and Me/Private/TopSecretPictures/"吗?
  • 对于部门的新命名标准,我必须更改所有目录名称

标签: windows scripting batch-file


【解决方案1】:

以下脚本递归重命名所有文件和目录,从给定目录开始,将空格转换为下划线。

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!
    )
    

    ***Vauge description...***不包括 for 循环本身,有趣的部分是:

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

    首先:延迟扩展...没有这个,命令解释器(无论出于何种原因微软决定将其编码为)将首先评估所有参数,然后运行脚本:所以这个版本的脚本确实不工作

    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: =_%

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      相关资源
      最近更新 更多