Domanda

mi piace creare un file batch (winxp cmd) che passa in modo ricorsivo attraverso una scelsero cartelle e sottocartelle e rinomina file non + cartelle con le seguenti regole:

da tutti i nomi di file + cartelle, tutto in maiuscolo + minuscole "V" e le lettere "W" devono essere sostituiti con le lettere "Y" e "Z".

es. 11V0W deve diventare 11Y0Z.

Credo che la sua possibile con FOR / R, ma come? Penso che ci deve essere una subroutine per essere chiamato che controlla ogni lettera una ad una in aggiunta alla ricorsione base con FOR / R.

È stato utile?

Soluzione

Il seguente lotto fa questo per i nomi dei file, almeno. Le directory sono un po 'più complicato (almeno io non sono riuscito a trovare una soluzione non infinita finora):

@echo off
setlocal enableextensions
for /r %%f in (*) do call :process "%%f"
endlocal
goto :eof

:process
pushd "%~dp1"
set fn=%~nx1
set fn=%fn:V=Y%
set fn=%fn:W=Z%
ren "%~nx1" "%fn%"
popd
goto :eof

Ma in teoria non dovrebbe essere troppo difficile per virare dir ridenominazione su questo.

Altri suggerimenti

Tom, trafficando con uno script precedente che ho postato, qui è un'elaborazione di tutti i file e le sottodirectory:

recurename.cmd directory

@echo off
setlocal ENABLEDELAYEDEXPANSION
set Replaces="V=Y" "W=Z" "m=A"
set StartDir=%~dp1
call :RenameDirs "%StartDir:~0,-1%"
exit /b 0
:RenameDirs
    call :RenameFiles "%~1"
    for /f "delims=" %%d in ('dir /ad /b "%~1"2^>nul') do call :RenameDirs "%~1\%%~d"
    if "%~1"=="%StartDir:~0,-1%" exit /b 0
    set _pos=0
    set _dir=%~f1
    set _dir_orig=!_dir!
    :finddirName
        set /a _pos-=1
        call set _dir_pos=!!!_dir:~%_pos%,1!!!
        if not "%_dir_pos%"=="\" goto finddirName
        call set _origines=!!!_dir:~0,%_pos%!!!
        set /a _pos+=1
        call set _dir=!!!_dir:~%_pos%!!!
    for %%r in (%Replaces%) do call set _dir=!!!_dir:%%~r!!!
    if /i not "!_dir!"=="!_dir_orig!" echo move "%~1" "%_origines%\!_dir!"
    exit /b 0
:RenameFiles
    for /f "delims=" %%f in ('dir /a-d /b "%~1"2^>nul') do (
        set _file=%%~nf
        set _file_orig=!_file!
        for %%r in (%Replaces%) do call set _file=!!!_file:%%~r!!!
        if /i not "!_file!"=="!_file_orig!" echo ren "%~1\%%f" "%~1\!_file!%%~xf"
    )
    exit /b 0

___ Note ____
Questo è uno script non distruttivo, rimuovere il echo i comandi giusti al fine di rinominare qualsiasi file / cartella. ( spostare echo e echo ren )

Imposta Sostituisce =: Imposta questa variabile per tutto ciò che è necessario coppie cambiato.

set startdir =: Ho voluto garantire, in qualche modo, l'argomento e prendendo solo il percorso da esso. Se un file è dato come parametro, l'intera directory contenitore e sottodirectory saranno trattati.

se "% ~ 1" == "% startdir: ~ 0, -1%" exit / b 0: Questa linea è stato posto per fermare la directory argomento stesso dalla fase di elaborazione. Se lo si desidera, rimuovere questa riga.
Se lo script viene chiamato con, diciamo, c: \ temp \ , la rimozione di questa linea avrebbe cambiato il nome in c:. \ TEAP \ alla fine

con questo albero di directory:

.
├── 00v0w
│   ├── 12V0W
│   ├── 12d0w
│   └── 12v0d
├── 11V0W
├── 11d0w
└── 11v0d

Renamer comandi:

$ renamer --regex --find '[vV]' --replace 'Y' '**'
$ renamer --regex --find '[wW]' --replace 'Z' '**'

produrrebbe questo output:

.
├── 00Y0Z
│   ├── 12Y0Z
│   ├── 12Y0d
│   └── 12d0Z
├── 11Y0Z
├── 11Y0d
└── 11d0Z
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top