Как я могу скопировать файл со статическим именем в другое место с увеличением числовых суффиксов? - PullRequest
0 голосов
/ 18 апреля 2011

У меня есть три файла в каталоге, которые появляются в другом процессе:

c:\result\results-a.txt
c:\result\results-b.txt
c:\result\results-c.txt

Каждый раз, когда они все появляются, я хотел бы скопировать их в другой каталог с возрастающим числовым суффиксом / префиксом, после того как файлы скопированы, их можно удалить. Каждый раз, когда запускается пакетный файл, он может начинаться с цифры 0 (ему не нужно сканировать целевой каталог и продолжать).

Ex. При первом появлении всех файлов целевой каталог может выглядеть следующим образом:

c:\archive\results-a.0000.txt
c:\archive\results-b.0000.txt
c:\archive\results-c.0000.txt

Когда они появятся во второй раз, целевой каталог будет содержать:

c:\archive\results-a.0000.txt
c:\archive\results-b.0000.txt
c:\archive\results-c.0000.txt
c:\archive\results-a.0001.txt
c:\archive\results-b.0001.txt
c:\archive\results-c.0001.txt

И так далее. Мне удобно соединять это в среде BASH, но мой клиент требует, чтобы это было сделано на машине с Windows NT (на самом деле, Windows 7). Может ли кто-нибудь начать меня?

[Правка - Ответ] Благодаря Джои ниже, это то, что я закончил кодировать.

@echo off
setlocal enabledelayedexpansion
set Counter=0

:loop
call :test_file %1\results1.txt
call :test_file %1\results2.txt
call :test_file %1\results3.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:\test\*.txt) do (
    call :lz
    move "%%f" "c:\tmp\c-!LZ!-%%~nxf"
)
set /a Counter+=1
goto :eof

Очень хорошее введение в пакетное программирование. Спасибо.

Ответы [ 2 ]

2 голосов
/ 18 апреля 2011

Вам нужно несколько штук, чтобы это сработало.

  1. Прежде всего, счетчик:

    set Counter=0
    
  2. Затем подпрограммаэто дополняет значение ведущими нулями:

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

    %LZ:~-4% является операцией подстроки, которая сохраняет последние четыре символа значения переменной.В данном случае это число, дополненное нулями до четырех мест.

  3. Цикл, который проверяет наличие файлов в определенном месте:

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

    Достаточно читаемый,это, я думаю.

  4. Подпрограмма, которая удаляет файлы:

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

Собирая все вместе, вы получаете

@echo off
setlocal enabledelayedexpansion
set Counter=0

:loop
  if exist c:\result\*.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:\result\*.txt) do (
    call :lz
    move "%%f" "some\target\directory\%%~nf.!LZ!%%~xf"
  )
  set /a Counter+=1
goto :eof

Может быть адаптирован для запоминания своего последнего значения.Однако это будет работать только в том случае, если командный файл находится в доступном для записи месте.

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

:loop
  if exist c:\result\*.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:\result\*.txt) do (
    call :lz
    move "%%f" "some\target\directory\%%~nf.!LZ!%%~xf"
  )
  set /a Counter+=1
  >>%~dpnx0 echo set Counter=%Counter%
goto :eof

:init

Обратите внимание, что последняя строка (:init) должна заканчиваться переводом строки (или лучше двумя; у меня было несколькопроблемы иногда только с одним в моем тестировании здесь).По сути, это создает подпрограмму в конце пакетного файла, которая многократно устанавливает счетчик до тех пор, пока он не достигнет своего последнего значения.

Хотя это не совсем быстро.В конце будет один set вызов на приращение счетчика, и все они будут выполняться изначально.

0 голосов
/ 18 апреля 2011

Вот кое-что, что должно начать вас. Перетащите это в файл с именем incrementName.bat и затем запустите его несколько раз подряд.

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...