Показать полную графическую версию : [решено] Копирование файлов
Добрый день. Подскажите пожалуйста по такому вопросу - Есть файлы acp00000NNN, где NN номер по порядку. Каждый день с утра данные файлы, начиная с порядкового номера 01, начинают падать в папку C:/111/. Из этой папки их нужно скопировать в папку C:/222/ где их подхватывает другая программа и переносит к себе, т.е. после того как программа их подхватила данных файлов в папке 222 нет. Вопрос заключается в том, что из папки 111 нужно копировать только свежий, т.е. только что пришедший файл, а те которые были скопированы ранее не трогать.
Как возможно сделать подобное копирование средствами cmd или vbs, на крайний случай powershell
да, старые, за вчерашний день удаляются, но в течение дня нет
Foreigner
21-03-2013, 23:25
где NN номер по порядку. » Т.е. последние две цифры?
С файлом для записи последнего номера
@echo off
setlocal
pushd "c:\111"
set "n=100"
2>nul (0<%date%.txt set /p "n=")
set /a n+=1
2>nul copy acp*%n:~1% "c:\222" && 1>%date%.txt echo %n%
popd
работает практически идеально, вот только если после первого файла сразу пришло еще два, то он при запуске батника кинет только один файл и только при следующем запуске второй. Как сделать так, чтобы кидались сразу несколько файлов ?
megaloman
22-03-2013, 14:03
@Echo Off
Set Otkuda=E:\111\
Set Kuda=E:\222\
If Not Exist %Otkuda%%0.log (
Echo %Otkuda%%0.log>>%Otkuda%%0.log
)
FOR /F "usebackq delims=" %%f IN (`xcopy %Otkuda%*.* %Kuda% /Y /EXCLUDE:%Otkuda%%0.log`) DO (
If Exist "%%f" Echo %%f>>%Otkuda%%0.log
)
Копирую сразу всё, что не копировалось, за один запуск батника. В папке 111 создаётся лог-файл с именем батника, в который батник при копировании заносит имена файлов, которые в последствии не копируются. Утром вы очищаете папку вместе с лог-файлом. Никаких номеров не анализирую - то, что не скопировано, скопируется. Можно вместо маски *.* в xcopy поставить маску Ваших файлов, например acp00000???. , если в папке пишется что-то еще. В папку 111 батник лучше не размещать. чтобы ненароком не убить.
лог лучше делать по дате, потому как папка 111 очищается другой программой, которая архивирует файлы acp каждое утро
megaloman
22-03-2013, 15:33
лог лучше делать по дате, - я продумывал этот вариант и отказался. Что будет, если вы запустите на новую дату батник, а 111 еще не очищен - получите кучу ненужных (дай бог, не вредных) файлов в 222.
просто получается, что с утра программа предыдущий день архивирует, а этот лог тогда руками нужно очищать, либо отдельным батником
все acp00000NNN, и отображает их в самой программе в меню архив (т.е. не просто складывает в папку, а учитывается в самой программе), я не знаю как она отреагирует на появление log файла, поэтому так даже боязнее чем лог по дате
Foreigner
22-03-2013, 16:52
Как сделать так, чтобы кидались сразу несколько файлов ? »
Не проверял:
@echo off
setlocal
pushd "c:\111"
:1
set "test=0"
set "n=100"
2>nul (0<%date%.txt set /p "n=")
set /a n+=1
2>nul copy acp*%n:~1% "c:\222" && (
1>%date%.txt echo %n%
set "test=1"
)
if "%test%"=="1" goto:1
popd
megaloman
22-03-2013, 17:04
что с утра программа предыдущий день архивирует Какие имена файлов архивирует? Почему бы не заархивировать и лог? Кстати, лог-файл можно назвать acp00000LOG, и если у архиватора маска подходящая, никаких дополнительно действий не надо. По дате лог сделать тоже не проблема, но это стрёмно.
Вот вариант, где лог-файл по дате в, например, корне диска E:\
@Echo Off
Set Otkuda=E:\111\
Set Kuda=E:\222\
Set Log=E:\%Date:~6,4%%Date:~3,2%%Date:~0,2%_%~nx0.log
If Not Exist %Log% (
Echo %Log%>>%Log%
)
FOR /F "usebackq delims=" %%f IN (`xcopy %Otkuda%*.* %Kuda% /Y /EXCLUDE:%Log%`) DO (
If Exist "%%f" Echo %%f>>%Log%
) Чтобы вернуться к предыдущему способу, замените одну строку с определением Log
Set Log=%Otkuda%%0.log
Или если делать лог-файл с именем E:\111\acp00000log. то заменить такой строкой
Set Log=%Otkuda%acp00000log.
Вышел на работу, попробовал скрипт:
C:\>Set Otkuda=c:\111\
C:\>Set Kuda=c:\222\
C:\>Set Log=c:\20130325_"C:\test.bat".log
C:\>If Not Exist c:\20130325_"C:\test.bat".log (Echo c:\20130325_"C:\test.bat".l
og 1>>c:\20130325_"C:\test.bat".log )
Синтаксическая ошибка в имени файла, имени папки или метке тома.
C:\>pause
Для продолжения нажмите любую клавишу . . .
C:\>FOR /F "usebackq delims=" %f IN (`xcopy c:\111\*.* c:\222\ /Y /EXCLUDE:
c:\20130325_"C:\test.bat".log`) DO (If Exist "%f" Echo %f 1>>c:\20130325_"C:\tes
t.bat".log )
"xcopy" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
megaloman
25-03-2013, 12:04
Set Log=c:\20130325_"C:\test.bat".log -откуда здесь кавычки?
У меня Set Log=C:\%Date:~6,4%%Date:~3,2%%Date:~0,2%_%0.log - то есть файл сегодня автоматически создастся с именем C:\20130325_nameofbat.bat.log - где nameofbat.bat наименование батника (не делайте его с пробелами или на русском языке), т е имя в Вашем случае будет C:\20130325_test.bat.log
Во вторых, если батник запускаете не из текущей директории (что, судя по примеру, и произошло), то сделайте
Set Log=C:\%Date:~6,4%%Date:~3,2%%Date:~0,2%_%~nx0.log
В третих, если батник запускаете из командного окна, попробуйте выполнить ручками предварительно команды
xcopy /?
Если она выполнится успешно, батник будет работать, иначе проблемы не в батнике
Можно тогда попробовать команду Path, среди доступных путей должно быть C:\Windows\system32; иначе система не находит файл xcopy.exe
ИМХО, этот стандартный путь должен присутствовать в системе в переменных среды.
-откуда здесь кавычки?
У меня Set Log=C:\%Date:~6,4%%Date:~3,2%%Date:~0,2%_%0.log»
Коллега, они у Вас в строке прописаны. Тильду забыли после процента в переменной %0 поставить, вот они и вылезли.
Попробуйте так:
Set Log="E:\%Date:~6,4%%Date:~3,2%%Date:~0,2%_%~nx0.log" Ибо имя батника может содержать пробел.
megaloman
25-03-2013, 13:49
gora, %0 кавычки не возвращает.
%0 кавычки не возвращает »
Батник Обрезка переменных.bat:
@Echo Off
:: Кодировка файла 'Кирилица DOS' (866)
Echo Запись Значение
Echo.
Echo %%0 %0
Echo %%~0 %~0
Pause>Nul Вывод в окно консоли:
Запись Значение
%0 "E:\Temp\Обрезка переменных.bat"
%~0 E:\Temp\Обрезка переменных.bat
со всем разобрался, всем спасибо!!!
megaloman
25-03-2013, 16:16
gora, Насчёт кавычек %0 я погорячился, но с кавычками у меня другая проблема, в xcopy в ключе /EXCLUDE: мне не удавалось пользоваться файлом, имя которого в кавычках.
с кавычками у меня другая проблема, в xcopy в ключе /EXCLUDE: мне не удавалось пользоваться файлом, имя которого в кавычках. »
Там кавычки не используются (не возможно использовать).
Можно обойти так:
Set Log="E:\%Date:~6,4%%Date:~3,2%%Date:~0,2%_%~nx0.log"
For %%i In (%Log%) Do Set shortpathlog=%%~si
...
FOR /F "usebackq delims=" %%f IN (`xcopy %Otkuda%*.* %Kuda% /Y /EXCLUDE:%shortpathlog%`) DO (
...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.