windows - Hvordan kan jeg kopiere en statisk navngivet fil til et andet sted med stigende numeriske suffiks?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har tre filer i en mappe, der vises via en anden proces:


c:
esult
esults-a.txt
c:
esult
esults-b.txt
c:
esult
esults-c.txt


Hver gang de alle vises, vil jeg gerne kopiere dem til en anden mappe med et stigende numerisk suffiks/præfiks, når filerne er kopieret, kan de slettes. Hver gang batchfilen starter, kan den starte med nummeret 0 (det behøver ikke at scanne målmappen og fortsætte).


Eks. Første gang filerne alle vises, kan målkataloget se sådan ud:


c:archive
esults-a.0000.txt
c:archive
esults-b.0000.txt
c:archive
esults-c.0000.txt


Anden gang de vises, vil målmappen da indeholde:


c:archive
esults-a.0000.txt
c:archive
esults-b.0000.txt
c:archive
esults-c.0000.txt
c:archive
esults-a.0001.txt
c:archive
esults-b.0001.txt
c:archive
esults-c.0001.txt


Og så videre. Jeg har det behageligt at piecere dette sammen i et BASH-miljø, men min klient kræver, at dette gøres på en Windows NT (Windows 7, faktisk) maskine. Kan nogen få mig til at starte?


[[Rediger - Svar]]
Takket være Joey nedenfor, er det hvad jeg endte med kodning.


@echo off
setlocal enabledelayedexpansion
set Counter=0

:loop
call :test\_file \%1
esults1.txt
call :test\_file \%1
esults2.txt
call :test\_file \%1
esults3.txt

timeout 2 /nobreak >nul
call :movefiles
timeout 2 /nobreak >nul
goto loop

:test\_file
timeout 2 /nobreak >nul
if not exist \%1 goto :test\_file
goto :eof

:lz
set LZ=000\%Counter\%
set LZ=\%LZ:~-4\%
goto :eof

:movefiles
for \%\%f in (C:	est*.txt) do (
    call :lz
    move "\%\%f" "c:	mpc-!LZ!-\%\%~nxf"
)
set /a Counter+=1
goto :eof


En meget god introduktion til batch programmering. Tak.

Bedste reference


Du har brug for et par stykker for at dette skal fungere.



  1. Først og fremmest en tæller:


    set Counter=0
    

  2. Så en subrutine, der pads værdien med ledende nul:


    :lz
      set LZ=000\%Counter\%
      set LZ=\%LZ:~-4\%
    goto :eof
    


    \%LZ:~-4\% er en substring operation, der bevarer de sidste fire tegn af variabelværdien. I dette tilfælde er dette et tal, nulpolstret til fire steder.

  3. Et loop, der kontrollerer filer på en bestemt placering:


    :loop
      if exist c:
    esult*.txt call :movefiles
      timeout 2 /nobreak >nul
    goto loop
    


    Ret læselig, denne gætter jeg.

  4. En underrutine, der flytter filerne væk:


    :movefiles
      setlocal enabledelayedexpansion
      for \%\%f in (C:
    esult*.txt) do (
        rem Generate the zero-padded number
        call :lz
        move "\%\%f" "some	argetdirectory\%\%~nf.!LZ!\%\%~xf"
      )
      endlocal
      rem Increment the counter for next use
      set /a Counter+=1
    goto :eof
    



Stykker alt det sammen forlader dig


@echo off
setlocal enabledelayedexpansion
set Counter=0

:loop
  if exist c:
esult*.txt call :movefiles
  timeout 2 /nobreak >nul
goto loop

:lz
  set LZ=000\%Counter\%
  set LZ=\%LZ:~-4\%
goto :eof

:movefiles
  for \%\%f in (C:
esult*.txt) do (
    call :lz
    move "\%\%f" "some	argetdirectory\%\%~nf.!LZ!\%\%~xf"
  )
  set /a Counter+=1
goto :eof


Det kan tilpasses for at huske sin sidste værdi. Dette vil dog kun fungere, hvis batchfilen befinder sig i en skrivbar placering.


@echo off
setlocal enabledelayedexpansion
set Counter=0
call :init

:loop
  if exist c:
esult*.txt call :movefiles
  timeout 2 /nobreak >nul
goto loop

:lz
  set LZ=000\%Counter\%
  set LZ=\%LZ:~-4\%
goto :eof

:movefiles
  for \%\%f in (C:
esult*.txt) do (
    call :lz
    move "\%\%f" "some	argetdirectory\%\%~nf.!LZ!\%\%~xf"
  )
  set /a Counter+=1
  >>\%~dpnx0 echo set Counter=\%Counter\%
goto :eof

:init


Bemærk, at den sidste linje (:init) skal afsluttes med en linjeskift (eller bedre to; jeg havde nogle problemer nogle gange med kun én i min testning her). Dette skaber i det væsentlige en subrutine i slutningen af ​​batchfilen, der sætter tælleren gentagne gange, indtil den kommer til sin sidste værdi.


Det er dog ikke rigtigt hurtigt. Der vil være et set opkald pr. Tællerforhøjelse i slutningen, og alle dem vil blive kørt oprindeligt.

Andre referencer 1


Her er noget der burde komme i gang. Sæt det i en fil kaldet incrementName.bat og kør den derefter flere gange i træk.


@echo off
goto :start
  --------------------------------------------

  incrementName.bat

  shows how to generate a filename with a monotonically
  increasing numeric portion.

  Run this several times in succession to see it in action.

  Mon, 18 Apr 2011  12:51

  --------------------------------------------

:START
setlocal enabledelayedexpansion

call :GETNEXTFILENAME rammalamma.txt
echo Next: \%nextname\%

@REM copy self to that new name.
copy \%0 \%nextname\%

GOTO END



--------------------------------------------
:GETNEXTFILENAME
@REM this is a subroutine.
@REM \%1 is the basename. This logic assumes a 3-character 
@REM filename extension. 
set fname=\%1
set ext=\%fname:~-3\%
set base=\%fname:~0,-4\%
set idx=0
:toploop1
  @set NUM=00000!idx!
  set nextname=\%base\%.!NUM:~-5!.\%ext\%
  if EXIST !nextname! (
    if !idx! GTR 99999 goto:FAIL
    set /a idx=!idx! + 1
    goto:toploop1
  )
)
:Success
goto:EOF
:Fail - overflow
set nextname=\%base\%.xxxxx.\%ext\%
goto:EOF
--------------------------------------------


:END
endlocal