0

「A」、「B」、「C」などの名前のディレクトリがいくつかあります。それぞれにいくつかのファイルがあります。ディレクトリ名と各ディレクトリの1から始まるインデックス番号を使用して、各ディレクトリのファイルの名前を変更します。左ゼロは3の幅に埋め込まれます。例:サブディレクトリAには3つのファイルがあり、名前は次のように変更されます。 :

A_001.dat
A_002.dat
A_003.dat

サブディレクトリBには2つのファイルがあり、名前を次のように変更する必要があります。

B_001.dat
B_002.dat

等々。これらのファイルはメインディレクトリに移動されます。次のバッチファイルがありますが、数を増やすことができないようです。助けてください。

@echo off

set HomeFolder=%CD%
set OldExt=TXT
set NewExt=DAT

setlocal ENABLEDELAYEDEXPANSION
for /f "delims=" %%a in ('dir *.%OldExt% /b /s') do (
    set i=1
    for /f "delims=" %%b in ("%%~dpa\.") do (
        set pad=00!i!
        set str=!pad:~-3!
        echo move /b "%%a" "%HomeFolder%\%%~nxb_!str!.%NewExt%"
        set /A i=!i!+1
)
)
endlocal
pause

そして正解は次のとおりです。

@echo off

set HomeFolder=%CD%
set OldExt=TXT
set NewExt=TIF
set i=1
set Folder=
set LastFolder=

setlocal ENABLEDELAYEDEXPANSION

for /f "delims=" %%a in ('dir *.%OldExt% /b /s') do (
    for /f "delims=" %%b in ("%%~dpa\.") do (
        set Folder=%%~nxb        
        if NOT !Folder!==!LastFolder! (set /A i=1)
        set LastFolder=!Folder!
        set pad=00!i!
        set str=!pad:~-3!
        copy /b "%%a" "%HomeFolder%\%%~nxb_!str!.%NewExt%"
        Set /A i+=1
    )
)

endlocal
4

3 に答える 3

1

ループまたは括弧式では、遅延展開を使用する必要があります

set /a variable=!variable!+1

ただし、setlocal ENABLEDELAYEDEXPANSION でこの機能を有効にし、一致する endlocal でリセットする必要があります。

次のことを試してください。

@echo off

set HomeFolder=%CD%
set OldExt=TXT
set NewExt=DAT

setlocal ENABLEDELAYEDEXPANSION

for /f "delims=" %%a in ('dir *.%OldExt% /b /s') do (
set i=1
for /f "delims=" %%b in ("%%~dpa\.") do (
    set pad=00%i%
    set str=%pad:~-3%
    echo move /b "%%a" "%HomeFolder%\%%~nxb_%str%.%NewExt%"
    set /A i+=1
)
)

endlocal

pause
于 2012-11-30T02:24:25.570 に答える
1
@echo off

:: By Elektro H@cker

Setlocal enabledelayedexpansion

set "OldExt=TXT"
set "NewExt=DAT"

FOR /R %%@ in (*%OldExt%) DO (

    REM Sets the directory of the file
    Set "Directory=%%~dp@"

    REM Cuts the directory name to obtain the last folder name
    Set "Directory=!Directory:~0,-1!"
    For /L %%X in (0,1,50) DO (Call Set "Directory=!Directory:*\=!")

    REM Check if this directory is the same of the last accesed directory to reset the counter or not
    Echo "!Directory!"|FINDSTR "^\"!LastDirectory!\"$" >NUL && (Set /A "Count+=1") || (Set /A "Count=1")

    REM Check if the number incrementation have 1-3 digits and copies the file
    Call Echo !COUNT!|FINDSTR "^[0-9]$"    >NUL && (Call Copy "%%@" ".\!Directory!_00!COUNT!.%NewExt%")
    Call Echo !COUNT!|FINDSTR "^[0-9].$"   >NUL && (Call Copy "%%@" ".\!Directory!_0!COUNT!.%NewExt%" )
    Call Echo !COUNT!|FINDSTR "^[0-9]..+$" >NUL && (Call Copy "%%@" ".\!Directory!_!COUNT!.%NewExt%"  )

    REM Sets the last accesed directory
    Call Set "LastDirectory=!Directory!"
)

Pause&exit

「A」「B」および「C」という名前の 3 つのサブディレクトリ、各サブディレクトリ内の 3 つのファイル、出力結果は次のとおりです。

a_001.DAT
a_002.DAT
a_003.DAT
b_001.DAT
b_002.DAT
b_003.DAT
c_001.DAT
c_002.DAT
c_003.DAT
于 2012-11-30T09:25:44.340 に答える
0

同じことをしたい人のための作業スクリプトは次のとおりです。

@echo off

set HomeFolder=%CD%
set OldExt=TXT
set NewExt=DAT
set i=1
set Folder=
set LastFolder=

setlocal ENABLEDELAYEDEXPANSION

for /f "delims=" %%a in ('dir *.%OldExt% /b /s') do (
    for /f "delims=" %%b in ("%%~dpa\.") do (
        set Folder=%%~nxb        
        if NOT !Folder!==!LastFolder! (set /A i=1)
        set LastFolder=!Folder!
        set pad=00!i!
        set str=!pad:~-3!
        copy /b "%%a" "%HomeFolder%\%%~nxb_!str!.%NewExt%"
        Set /A i+=1
    )
)

endlocal
于 2012-11-30T20:58:27.800 に答える