2

選択したフォルダーとサブフォルダーを再帰的に通過し、次のルールでファイルとフォルダーの名前を変更するバッチファイル (winxp cmd) を作成するのが好きです。

すべてのファイル + フォルダ名から、すべての大文字と小文字の「V」と「W」の文字を文字「Y」と「Z」に置き換える必要があります。

たとえば、11V0W は 11Y0Z にならなければなりません。

FOR /R で可能だと思いますが、どうすればよいですか? FOR /R による基本的な再帰に加えて、各文字を 1 つずつチェックするサブルーチンを呼び出す必要があると思います。

4

3 に答える 3

6

次のバッチは、少なくともファイル名に対してこれを行います。ディレクトリは少しトリッキーです (少なくとも、これまで無限ではない解決策を思いつくことはできませんでした):

@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

しかし、理論的には、ディレクトリの名前変更をこれに追加するのはそれほど難しくありません。

于 2009-04-04T15:39:58.950 に答える
6

トム、私が投稿した以前のスクリプトをいじっています。これは、すべてのファイルとサブディレクトリを処理するスクリプトです。

recurename.cmd ディレクトリ

@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

___注意____
これは非破壊的なスクリプトです。ファイル/ディレクトリの名前を変更するには、正しいコマンドからエコーを削除してください。(エコームーブエコーレン)

Replaces=を設定: この変数を、変更が必要なペアに設定します。

set Startdir=:どうにかして、引数を保護し、そこからパスのみを取得したかったのです。ファイルがパラメータとして与えられた場合、コンテナ ディレクトリ全体とサブディレクトリが処理されます。

if "%~1"=="%StartDir:~0,-1%" exit /b 0:この行は、引数ディレクトリ自体が処理されないようにするために配置されました。必要に応じて、この行を削除してください。
スクリプトがたとえばc:\temp\で呼び出された場合、この行を削除すると、最終的に名前がc:\teAp\に変更されます。

于 2009-08-26T19:20:38.980 に答える
0

このディレクトリ ツリーで:

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

これらの名前変更コマンド:

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

次の出力が生成されます。

.
├── 00Y0Z
│   ├── 12Y0Z
│   ├── 12Y0d
│   └── 12d0Z
├── 11Y0Z
├── 11Y0d
└── 11d0Z
于 2013-10-04T08:05:26.910 に答える