Как переименовать только подпапки без изменения имен родительских папок - PullRequest
0 голосов
/ 15 октября 2019

У меня есть папка, содержащая несколько сотен подпапок в формате Name, ID. Каждая из этих папок содержит несколько подпапок, некоторые из которых содержат пробелы в своих именах. Я хотел бы переименовать только подпапки, а не родительские папки, заменив пробелы подчеркиванием, например, C:\Location\John, 1234\My Documents на C:\Location\John, 1234\My_Documents.

Я попытался изменить фрагмент скрипта, который обнаружил здесь, ноэто также меняет родительскую папку

Вот неотредактированный код:

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

cd /D %SystemRoot%
set "RenameError="

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


: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

Как я уже сказал, ожидаемый результат для каждой подпапки должен быть C:\Location\John, 1234\My_Documents вместо C:\Location\John, 1234\My Documents. В настоящее время с кодом, который я имею, я получаю C:\Tydelik\John,_1234\My_Documents.

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Хотя решение Compo переименовывает папки «глубиной = 2», это переименовывает только «листы» (самые последние папки дерева, «глубина = последняя»). Я сохранил ваш call подход, чтобы избежать отложенного расширения и возможных возможных проблем (имена папок с ! - маловероятны в вашей ситуации, но никто не знает ...)

@echo off
setlocal
set "sourcedir=..\..\"
for /f "delims=" %%I in ('dir "%sourcedir%" /ad /b /s 2^>nul') do call :RenameFolder "%%I"
goto :eof

:RenameFolder
dir /ad /b /s "%~1" 2>nul | find /v "" >nul && goto :eof  ::skip renaming, if a subfolder exists
set "leaf=%~nx1"
ECHO ren "%~1" "%leaf: =_%"
goto :eof

Примечание: по соображениям безопасностиЯ отключил команду ren, просто повторив ее. Если все работает как задумано, удалите ECHO.

0 голосов
/ 15 октября 2019

Вот пример того, что, я думаю, вы ищете, основываясь на том факте, что вы заинтересованы только в переименовании подкаталогов "C:\Tydelik\Name, ID", а не в этих подкаталогах:

@Echo Off
SetLocal DisableDelayedExpansion
Set "SourceDir=C:\Tydelik"
For /F "EOL=?Delims=" %%A In ('Dir /B/AD "%SourceDir%" 2^>NUL'
)Do Set "TargetDir="&For /F "EOL=?Delims=" %%B In (
    'Dir /B/AD "%SourceDir%\%%A" 2^>NUL') Do (Set "TargetDir=%%B"
    SetLocal EnableDelayedExpansion
    If Not "!TargetDir: =!"=="!TargetDir!" (
        Ren "%SourceDir%\%%A\%%B" "!TargetDir: =_!")
    EndLocal)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...