пакетный файл избавиться от указать имя файла или имя каталога в целевом сообщении

У меня есть проблема с моим пакетным файлом, который включает 10-секундную задержку между каждым просмотром указанной папки и вызовом подпрограммы для соглашения об именах: ...пакет, который копирует измененные файлы из каталога в другой каталог

Я изменил код в соответствии с Кеном Уайтом, что было очень полезно, однако у меня есть другая проблема, которая в дальнейшем связана с этим пакетом, заключающаяся в том, что когда пакет запускается, и я выполняю обновление тестового файла и сохраняю его в исходном каталоге, пакет просит меня в консоли cmd «указать имя файла или имя каталога в цели» для КАЖДОГО файла, который он просматривает. Поскольку я хочу, чтобы это автоматически работало в фоновом режиме, я не хочу, чтобы пользовательский ввод выполнялся правильно. Любая помощь или предложения будут очень полезны.

Вот что у меня есть на данный момент:

@Echo Off & setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
:: variables
set drive=C:\Users\me\Desktop\Test Source Folder\
set backupcmd=xcopy /m /s /c /d /e /h /i /r /y
Set _Delay=10
Set _Monitor=C:\Users\me\Desktop\Test Source Folder
Set _Base=%temp%\BaselineState.dir
Set _Chck=%temp%\ChkState.dir
Set _OS=6

:_RevLoop
set basename=
for %%a in (*.*) do (
if not defined baseName (
    rem Is first name of first set
    set baseName=%%~Na
    set baseExt=%%~Xa
    set lastname=%%~Na
    ) else (
    rem Check if this name begin with same baseName
    set name=%%~Na
    for %%b in (!baseName!) do set name=!name:*%%b=!
      if "!name!" neq "%%~Na" (
         rem Yes: Is next name of same set
         set lastName=%%~Na
      ) else (
         rem No: Is first name of next set: copy previous set and pass to next one
         %backupcmd% "!lastName!!baseExt!" "C:\Users\me\Desktop\Test Destination Folder\!baseName!!baseExt!"
         set baseName=%%~Na
         set baseExt=%%~Xa
         set lastName=%%~Na
      )
   )      
)
rem Copy last set
%backupcmd% "!lastName!!baseExt!" "C:\Users\me\Desktop\Test Destination Folder\!    baseName!!baseExt!"


Ver|Findstr /I /C:"Version 5">Nul
If %Errorlevel%==0 Set _OS=5 & Set /A _Delay=_Delay*1000
:_StartMon
Call :_SetBaseline "%_Base%" "%_Monitor%"
:_MonLoop
If %_OS%==5 (Ping 1.0.0.0 -n 1 -w %_Delay%>Nul) Else Timeout %_Delay%>Nul
Call :_SetBaseline "%_Chck%" "%_Monitor%"
FC /A /L "%_Base%" "%_Chck%">Nul
If %ErrorLevel%==0 Goto _MonLoop



echo ___ Backing up JobBoss files...
::%backupcmd% "C:\Users\me\Desktop\Test Source     Folder" "C:\Users\me\Desktop\Test Destination Folder\"

::CALL "C:\users\me\Desktop\Test Source Folder\Test.bat"

ECHO ___ Checking for new file revisions...


GOTO :_RevLoop


Echo.Backup Complete!

Goto :_StartMon
:::::::::::::::::::::::::::::::::::::::::::::::::::
:: Subroutine
:::::::::::::::::::::::::::::::::::::::::::::::::::
:_SetBaseline
If Exist "%temp%\tempfmstate.dir" Del "%temp%\tempfmstate.dir"
For /F "Tokens=* Delims=" %%I In ('Dir /S "%~2"') Do (
Set _Last=%%I
 >>"%temp%\tempfmstate.dir" Echo.%%I
)
>"%~1" Findstr /V /C:"%_Last%" "%temp%\tempfmstate.dir"
Goto :EOF

person cheapkid1    schedule 29.11.2012    source источник
comment
возможный дубликат файла xcopy, переименовать, подавить. xxx указать имя файла... сообщение   -  person Neil    schedule 30.11.2012


Ответы (1)


Предполагая, что вам не нужно переименовывать файлы при их копировании, попробуйте

%backupcmd% "!lastName!!baseExt!" "C:\Users\me\Desktop\Test Destination Folder\"

Примечание. Я считаю, что \ в конце сводит на нет необходимость переключателя /i.

Изменить: новая стратегия. Сначала скопируйте базовый файл с помощью приведенной выше команды, а затем, когда вы скопируете окончательный файл, он перезапишет его без запроса.

for %%a in (*.*) do (
    if not defined baseName (
        rem Is first name of first set
        set baseName=%%~Na
        set baseExt=%%~Xa
        set lastname=%%~Na
        %backupcmd% "%%a" "C:\Users\me\Desktop\Test Destination Folder\"
    ) else (
        rem Check if this name begin with same baseName
        set name=%%~Na
        for %%b in (!baseName!) do set name=!name:*%%b=!
        if "!name!" neq "%%~Na" (
            rem Yes: Is next name of same set
            set lastName=%%~Na
        ) else (
            rem No: Is first name of next set: copy previous set and pass to next one
            %backupcmd% "!lastName!!baseExt!" "C:\Users\me\Desktop\Test Destination Folder\!baseName!!baseExt!"
            set baseName=%%~Na
            set baseExt=%%~Xa
            set lastName=%%~Na
            %backupcmd% "%%a" "C:\Users\me\Desktop\Test Destination Folder\"
        )
    )
)
person Neil    schedule 29.11.2012
comment
Мне нужно переименовать их, исходный каталог содержит (т.е.) example.xls и exampleA.xls. - person cheapkid1; 30.11.2012
comment
Мне нужно переименовать их, исходный каталог содержит (т.е.): example.xls и exampleA.xls, целевой каталог содержит: example.xls. Пакетный файл будет постоянно отслеживать исходный каталог и копировать любые обновленные или новые файлы (т. е.) exampleA.xls будет скопирован в целевой каталог как example.xls (заменяя существующий файл с именем example.xls). - person cheapkid1; 30.11.2012
comment
Может ли кто-нибудь помочь мне с этой проблемой? - person cheapkid1; 10.12.2012
comment
Он по-прежнему просит меня в консоли cmd указать имя файла или имя каталога в цели для КАЖДОГО файла, который он просматривает. И по какой-то причине он не копирует все тестовые файлы в исходной папке, которые должны быть скопированы в папку назначения с этим последним изменением. Я не понимаю, почему он все еще спрашивает меня об этом, когда я использую xcopy. - person cheapkid1; 12.12.2012
comment
Это работало раньше всего, за исключением указания «F» для имени файла или «D» для имени каталога в целевом сообщении в консоли. Это то, что мне нужно уйти, я не хочу получать подсказки о том, что должно быть фоновым запуском автоматизированной консоли. - person cheapkid1; 13.12.2012
comment
@cheapkid1 Упс, я опечатался в своих %a - они, конечно, должны быть %%a. Прости за это. Это помогает? - person Neil; 14.12.2012
comment
Это сработало, за исключением того, что в консоли отображаются даже файлы, которые он не копирует. Например, скопировано 0 файлов. Если у меня много файлов, что я и делаю. Это по-прежнему будет представлять трудоемкую проблему. Есть ли способ просто отображать только копируемые файлы?? - person cheapkid1; 26.12.2012
comment
@cheapkid1 Возможно, вы могли бы передать вывод команды в find /v "0 File(s) copied". - person Neil; 27.12.2012
comment
Ускорит ли это процесс? Или пакет по-прежнему будет проверять каждый файл, просто отображая только те файлы, которые были скопированы? - person cheapkid1; 28.12.2012
comment
Самой медленной частью операции будет копирование файлов, которые необходимо скопировать. Проверяется только первый файл каждого пакета, и эта операция будет сравнительно быстрой. Уменьшение вывода с помощью find /v может фактически привести к большей разнице в скорости. - person Neil; 28.12.2012
comment
где разместить скопированные файлы find /v 0? - person cheapkid1; 28.12.2012
comment
@cheapkid1 Вы можете добавить | find /v "0 File(s) copied" в конец обеих строк %backupcmd% или, альтернативно, изменение последней строки на ) | find /v "0 File(s) copied" также должно работать. - person Neil; 29.12.2012
comment
Большое спасибо за вашу помощь. Это отлично сработало. Очень признателен. - person cheapkid1; 31.12.2012