Pergunta

Eu gosto de criar um arquivo de lote (winxp cmd) que recursivamente passa por um escolheu pasta pastas e sub e renomeia há arquivos + pastas com as seguintes regras:

de todos os arquivos + pasta nomes, todas as letras maiúsculas + minúscula "V" e "W" cartas precisam ser substituídos com as letras "Y" e "Z".

por exemplo. 11V0W deve tornar-se 11Y0Z.

Eu acredito que é possível com a FOR / R mas como? Eu acho que precisa ser uma sub-rotina a ser chamado, que verifica cada carta, um por um, além de recursão básica com FOR / R.

Foi útil?

Solução

O lote seguinte faz isso para os nomes de arquivos, pelo menos. Diretórios são um pouco mais complicado (pelo menos eu não poderia vir acima com uma solução não-infinito até agora):

@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

Mas, em teoria, não deve ser muito difícil de renomeação tack dir sobre isso.

Outras dicas

Tom, brincar com um script anterior eu postei, aqui está um processamento de todos os arquivos e subdiretórios:

recurename.cmd diretório

@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

___ Notas ____
Este é um script não-destrutivo, remover o echo a partir dos comandos corretos, a fim de mudar o nome de qualquer arquivo / diretório. ( echo movimento e echo ren )

Definir Substitui =: Definir esta variável para qualquer pares que você precisa mudou.

set startdir =: Eu queria garantir, de alguma forma, o argumento e tendo apenas o caminho dele. Se um arquivos é dado como um parâmetro, todo o diretório recipiente e subdiretórios serão processados.

se "% ~ 1" == "% startdir: ~ 0, -1%" exit / b 0: Esta linha foi colocada para parar o diretório próprio argumento de ser processado. Se assim o desejar, remova esta linha.
Se o script é chamado com, digamos, c: \ temp \ , removendo essa linha mudaria o nome para c:. \ TEAP \ no final

com esta árvore de diretório:

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

renamer comandos:

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

produziria esta saída:

.
├── 00Y0Z
│   ├── 12Y0Z
│   ├── 12Y0d
│   └── 12d0Z
├── 11Y0Z
├── 11Y0d
└── 11d0Z
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top