首页 > 解决方案 > 如何从批处理文件中的特定文件夹及其子文件夹中查找名称不带下划线的所有 jpeg 文件,然后重命名

问题描述

我有以下脚本,它获取位于子文件夹 IN 中的所有 .jpg 或 .png 类型的文件,并将其重命名为 IN 上一层的文件夹名称,该文件夹名称以代理编号命名。

例如,有这个路径\\servername\SECH\DATA\CLI\45\IN\image504.jpeg,它应该将它重命名为45_image504.jpeg.

我想使用 for /R 因为我希望它只在 CLI 的子文件夹中查看,除非有另一种方法可以传递位置以在 for 循环中搜索。我想知道如何改进此脚本以查找名称中没有下划线的 jpg 文件。

For /R  \\servername\CLI\ %%a in (*.jpg *.png) DO (    echo filename %%~nxa     For %%g in (%%a\..) do ( 
     SET LAST_FOLDER=%%~nxg
     If "!LAST_FOLDER!" == "IN" (
         FOR %%V IN (%%a\..\..) DO (
              SET FOLDER_NAME=%%~nxV
              SET CURRENT_FILE_NAME=%%~nxa
              SET PREFIX=!FOLDER_NAME!_

              echo FOLDER_NAME : !FOLDER_NAME!
              echo CURRENT_FILE_NAME  : !CURRENT_FILE_NAME!
              If "!CURRENT_FILE_NAME:~0,4!" == "!PREFIX!" ( 
                   echo filename exists
               ) Else (
                  Rename "%%~a" "!FOLDER_NAME!_%%~nxa"
              )  
    
         )
      )
                    ) )

标签: windowsbatch-filecmd

解决方案


由于目标文件位于某个目录层次结构深度中,因此您可能不应该递归搜索它们以避免意外匹配。

因此我会这样做:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_ROOT=\\servername\SECH\DATA\CLI"      & rem // (full path to target dir.)
set "_SDIR=IN"                              & rem // (name of sub-sub-directory)
set "_VSTR=_"                               & rem // (separator char. or string)
set _MASKS="*.jpg" "*.jpeg" "*.jpe" "*.png" & rem // (list of quoted patterns)

rem // Change into target directory:
pushd "%_ROOT%" && (
    rem // Loop through immediate sub-directories:
    for /D %%E in ("*") do (
        rem // Change into sub-sub-directory:
        pushd "%%~E\%_SDIR%" 2> nul && (
            rem // Loop through matching files, excluding those with separator:
            for /F "delims= eol=|" %%F in ('
                dir /B /A:-D-H-S %_MASK% ^| findstr /V /I /C:"%_VSTR%"
            ') do (
                rem // Actually rename the current file:
                ren "%%F" "%%~nxE%_VSTR%%%F"
            )
            rem // Return from sub-sub-directory:
            popd
        )
    )
    rem // Return from target directory:
    popd
)

endlocal
exit /B

推荐阅读