Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 8

Автор: AlexanderBV
Дата сообщения: 26.03.2010 14:08
yurkesha
Ясно, спасибо.
Знаю в какую сторону теперь копать.
Автор: TAVulator
Дата сообщения: 26.03.2010 14:38
wolf0425

Цитата:
Код:for /f "delims=" %%a in (file.lst) do for /r %%a %%i in (*.*) do dir "%%~fi"

спасибо за ответ.
Пишет, что Непредвиденное появление: %i.

Как все-таки это сделать?
Автор: wolf0425
Дата сообщения: 26.03.2010 14:39

Цитата:
12345678.001 26.03.2010 10:00 100 Кб
12345678.002 26.03.2010 10:01 500 Кб
12345678.003 26.03.2010 18:00 200 Кб
12345678.004 26.03.2010 18:20 800 Кб
Требуемый файл - 12345678.002
Требуемый файл - 12345678.002
почему 002 когда 004 имеет ту же дату и больше?

Цитата:
при этом сначала отобрать файлы с самой ранней датой создания
Именно временем создания, а не временем последней его модификации?


Цитата:
Второй скопированый файл должен быть создан вчера, с самой поздней датой создания и самим меньшим размером. Пример:
12345678.001 25.03.2010 10:00 100 Кб
12345678.002 25.03.2010 10:30 500 Кб
12345678.003 25.03.2010 22:00 200 Кб
12345678.004 25.03.2010 22:10 800 Кб
Требуемый файл - 12345678.003
опять непонятно почему 003 а не 12345678.001 - у него размер явно меньше. а у 12345678.004 - дата ещё более последняя.


Цитата:
Чота вспомнилось, сегодня раки маленькие.
а вот вчера большие но по 5 рублей.
угу, именно оно.

TAVulator
Цитата:
спасибо за ответ.
Пишет, что Непредвиденное появление: %i.
Как все-таки это сделать?
тогда так:
Код: for /f "delims=" %%a in ('type file.lst') do (
    dir "%%~fa"
    for /f "delims=" %%i in (' dir /b/s/a:d "%%~fa"') do dir "%%i\"
)
Автор: AlexanderBV
Дата сообщения: 26.03.2010 16:04
Именно поэтому я указал время. 002 имеет раннее время создания. Сначала должны отфильтроваться 001 и 002, так как оба созданы раньше всех 26.03.2010 10:00 (получается с точностью в 1 минуту, секундами можно пренебречь), а затем среди них уже нужен файл 002 так как у него больше размер. 004 создавался позже.
Тоже касается и второго файла: за вчера самые "поздние" файлы будут 003 и 004 (в моем сообщении дата и время 25.03.2010 22:00 у обеих файлов), среди них 003 имеет меньший размер. Иногда файлов с полностью одинаковой датой и временем создания не 2, а 1, тогда по размеру сравнение не нужно.

Автор: wolf0425
Дата сообщения: 26.03.2010 17:43

Цитата:
Именно поэтому я указал время
именно поэтому я и поправил пример на чуть другое время, когда спрашивал.

Цитата:
(получается с точностью в 1 минуту, секундами можно пренебречь),
ниоткуда из предыдущего описания не следует что секундами допустимо и нужно пренебрегать.


Цитата:
а затем среди них уже нужен файл 002 так как у него больше размер.

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


Цитата:
Тоже касается и второго файла: за вчера самые "поздние" файлы будут 003 и 004
нет, самый поздний - он единственный, по определению самого позднего.
Если тебе нужно посравнивать несколько самых поздних - то надо было не лениться сразу писать критерий выбора этих нескольких.

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

Кстати ты проигнорировал вопрос - нужен файл в который последним модифицирован или действительно который последним создан? это очень разное время.
Автор: AlexanderBV
Дата сообщения: 26.03.2010 18:24
Я не проигнорировал, в предыдущем сообщении написал дата создания. Касательно остального прийду на работу - отпишу.
Автор: wolf0425
Дата сообщения: 26.03.2010 19:33

Цитата:
Я не проигнорировал, в предыдущем сообщении написал дата создания.
напрочь не вижу - там по контексту слова одинаково подходит и создание и модификация, и никакой уверенности что ты не путаешь одно с другим - так и не наступило.
Ну если ты уверен что создания - не вопрос...
Автор: yurkesha
Дата сообщения: 26.03.2010 20:28
wolf0425

Цитата:
при этом сначала отобрать файлы с самой ранней датой создания

Дык AlexanderBV чуток подсказать надо - дальше он сам справится... Надо же с чего-то начинать... Если неправильно сформулировал - в процессе отладки переформулирует...
Автор: lorents
Дата сообщения: 26.03.2010 21:25
l3ha,wolf0425
Все получилось! Спасибо!

Не подскажите, как можно сделать проверку файлов, т.е. проверить все ли необходимые файлы есть, если да, то продолжить работу батника, если нет, то выдать сообщение, что следующие файлы не обнаружены и список файлов?

И как можно сделать, чтобы батник нельзя будет запускать, если он уже запущен?
В конце я батник буду конвертировать в exe
Автор: rdenk1
Дата сообщения: 26.03.2010 23:25
Есть определенная папка, можно ли удалить в ней все файлы, дата создания которых старее на 7 или более дней по сравнению с текущей датой? Кстати, имя файла совпадает с его датой создания.
Автор: TAVulator
Дата сообщения: 26.03.2010 23:47
wolf0425 спасибо, помогло ))

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

Код: @echo OFF
echo Sync_TAV
echo Start %date% - %time% >>log.txt

Set c_Day=%Date:~0,2%
Set c_Month=%Date:~3,2%
Set c_Year=%Date:~6,4%
Set c_Hour=%Time:~0,2%
Set c_Min=%Time:~3,2%
for /f "delims=" %%a in ('type list.txt') do (
echo "%%~fa"
for /f "delims=" %%i in ('dir /b/s/a:d "%%~fa"') do (
echo "%%~fi"
for /f "delims=" %%b in ('dir /b/s/a:-d "%%~fi"') do (
echo "%%b"
@Call :Goo %%b %%~tb
)
)
)
REM ---
echo End %date% - %time% >>log.txt
GoTo :EOF
:Goo
rem echo Goo
Set f_Name=%1
Set f_Date=%2
Set f_Time=%3
Set f_Day=%f_Date:~0,2%
Set f_Month=%f_Date:~3,2%
Set f_Year=%f_Date:~6,4%
Set f_Hour=%f_Time:~0,2%
Set f_Min=%f_Time:~3,2%

If /I %f_Year%==%c_Year% (
If /I %f_Month%==%c_Month% (
If /I %f_Day%==%c_Day% (
Echo %F_Name% >>new_list.txt
Echo %F_Name% %f_Day%.%f_Month%.%f_Year%
)
)
)
GoTo :EOF
Автор: wolf0425
Дата сообщения: 27.03.2010 00:36

Цитата:
есть список каталогов. нужно из этих каталогов со всеми подкаталогами взять все файлы с сегодняшней датой и записать их полный путь в отдельный файл.
это на for вложенности меньше чем заявка запускать чего-то абтрактное (dir я же там вписывал для примера) в каждом из подкаталогов каталога списка.
Да и сравнение на текущую дату у тебя перегружено.


Код: @echo off
for /f "delims=" %%a in ('type list.txt') do (
echo "%%~fa"
for /f "delims=" %%i in ('dir /b/s/a-d "%%~fa"') do (
echo %%~ti | 1>nul findstr /b /c:"%date%" && 1>>new_list.txt echo.%%~fi
)
)
)
Автор: AlexanderBV
Дата сообщения: 27.03.2010 00:46
wolf0425
Я не путаю одно с другим и знаю разницу между датой создания и модификации.

Цитата:
ниоткуда из предыдущего описания не следует что секундами допустимо и нужно пренебрегать
согласен

Цитата:
брать просто тот единственный что система считает самым свежим - нельзя?
угумс

Цитата:
Если тебе нужно посравнивать несколько самых поздних - то надо было не лениться сразу писать критерий выбора этих нескольких.
Да я и не ленился, просто в процессе изначального написания, не учитывал ряд вещей, кои в последствии переформулировал.

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

Вот не выдуманный пример:
В папке у меня имеются файлы:
12345678.384    7784     24.03.2010 19:18
12345678.360    5984     24.03.2010 12:38
12345678.351    5528     24.03.2010 11:21
12345678.348    1928     24.03.2010 03:35
12345678.349 24880     24.03.2010 03:35
12345678.347 24880     23.03.2010 23:49
12345678.346    1928     23.03.2010 23:49
12345678.344    1928     23.03.2010 23:34
12345678.345 24880 23.03.2010 23:34
Мне нужно скопировать файлы .349 и .344 (в данном случае подойдет и .346, но только не .348)
Автор: wolf0425
Дата сообщения: 27.03.2010 00:52
yurkesha

Цитата:
Если неправильно сформулировал - в процессе отладки переформулирует...

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

но если ему действительно надо странное - то


Код: for /f "delims=" %%a in ('dir /n /t:c /o-d /a-d ^| findstr /v /B /c:" " ') do set "str=%%~a" & call:proc %%~a
exit

:proc
rem и тут на выбор из %1...%4 или из %str% разбирать дату/время/размер/имена как нравится.
Автор: AlexanderBV
Дата сообщения: 27.03.2010 00:59
rdenk1
Можно.
forfiles.exe /p D:\test\ /s /m *.* /d -14 /c "cmd /c del /q /f @file"
Удаляет все файлы в папке D:\test\ старше 14 дней.
forfiles.exe - утилита из ресурс кита 2003 сервера, подходит под ХР
Есть и под Windows2000, но размер меньше и ключи отличаются.

Добавлено:
wolf0425
Это не логи, а только свеже созданные файлы в указанное выше время, у них дата создания и модификации будет отличатся 2-мя - 3-мя секундами.

Цитата:
но если ему действительно надо странное
Что значит "странное"?

Автор: wolf0425
Дата сообщения: 27.03.2010 08:36

Цитата:
Это не логи, а только свеже созданные файлы в указанное выше время, у них дата создания и модификации будет отличатся 2-мя - 3-мя секундами.
ну а я о чем. рабочие файлы. и время модификации доступно просто из %%~ti - в отличие от времени создания, доступного только через dir /t:c.


Цитата:
Что значит "странное"?
условия, которые быстро и понятно сформулировать не получается.

Автор: king_stiven
Дата сообщения: 27.03.2010 09:12
rdenk1
В шапке есть ещё варианты решения.
Автор: TAVulator
Дата сообщения: 27.03.2010 09:26

Цитата:
это на for вложенности меньше чем заявка запускать чего-то абтрактное (dir я же там вписывал для примера) в каждом из подкаталогов каталога списка.
Да и сравнение на текущую дату у тебя перегружено.



Код: @echo off
for /f "delims=" %%a in ('type list.txt') do (
echo "%%~fa"
for /f "delims=" %%i in ('dir /b/s/a-d "%%~fa"') do (
echo %%~ti | 1>nul findstr /b /c:"%date%" && 1>>new_list.txt echo.%%~fi
)
)
)


всех делов практически в одну строку
Автор: kumarp
Дата сообщения: 27.03.2010 11:23
Здравствуйте.
Получаю список файлов в каталоге на удаленном сервере для последующего разбора. Вопрос: каким оптимальным способом мне узнать, количество выбранных файлов.

Код:
curl -q --output %dstdir%shots.list -u %FTP_LOGIN_PASSWORD% --list-only %FTP_DOMAIN%%FTP_DIR_UPLOAD%
:: перед выполнением следующей команды мне уже нужно знать количество файлов
for /f "tokens=*" %%i in (%dstdir%shots.list) do call :GET_FILE %%i
Автор: 01MDM
Дата сообщения: 27.03.2010 11:42
kumarp
А какой формат в shots.list? Если одна строчка один файл, то просто добавь подсчет:

Код:
:: в данной строке мне уже нужно знать количество файлов
for /f "tokens=*" %%i in (%dstdir%shots.list) do (
set /a count+=1
call :GET_FILE %%i
)
echo %count%
Автор: kumarp
Дата сообщения: 27.03.2010 11:46
01MDM
спасибо, но нужно знать раньше, до выполнения следующей команды.
я не точно дал коммент в коде (подправил)

Да, а формат простой - 1 строка = 1 имя файла
Автор: lorents
Дата сообщения: 27.03.2010 11:47
Объясните, пожалуйста, где ошибка

Код: @echo off
tasklist | find /i "process.exe">nul
if %errorlevel%==1 process.exe
Автор: 01MDM
Дата сообщения: 27.03.2010 11:53
kumarp

Цитата:
но нужно знать раньше, до выполнения следующей команды.

Тогда просто сосчитай их:

Код:
for /f %%i in (%dstdir%shots.list) do set /a count+=1
echo %count%
for /f "tokens=*" %%i in (%dstdir%shots.list) do call :GET_FILE %%i
Автор: kumarp
Дата сообщения: 27.03.2010 11:57
01MDM,

Цитата:
Тогда просто сосчитай их

Спасибо, пока так и сделаю. Смущает лишь сильная зависимость времени исполнения от количества выбранных файлов.
Автор: wolf0425
Дата сообщения: 27.03.2010 11:57
TAVulator
Цитата:
И не мог бы ты "разжевать" эту строку:
echo %%~ti | 1>nul findstr /b /c:"%date%" && 1>>new_list.txt echo.%%~fi
совсем не понял как она работает.

имеем текущую строку в %%i, трактуем её как имя файла
echo %%~ti |
печатаем дату/время текущего файла с перенаправлением на ввод следующей команды
1>nul findstr /b /c:"%date%"
ищем, во входящем потоке (не указано имя файла), cтроки, имеющие в начале строки (/b) текст (/c 27.03.2010 (так сегодня раскрывается %date%), всё найденное никуда не печатаем (1>nul)
&& 1>>new_list.txt echo.%%~fi
в случае успешного завершения поиска в предыдущей команде (&&) в хвост файла (1>>new_list.txt) печатаем полное текущее имя (echo.%%~fi)


Цитата:
И если ситуация будет такая, что нужно будет составить список файлов не с сегодняшней датой, а с вчерашней (т.е. на день назад) как это будет выглядеть?
громоздко это будет - дешевых способов автоматом загнать в переменную (или в строку) представление вчерашней даты - на батфайлах нет, придется извращаться или с ручным длинным вычислением команадми батника или вставкой бейсик-скрипта или внешние утилиты искать.
Автор: lorents
Дата сообщения: 27.03.2010 12:20
01MDM

Цитата:
Какая версия виндоус? Если XP Home, то в ней нет tasklist и много еще чего.

как раз XP Home, да не повезло мне
Автор: wolf0425
Дата сообщения: 27.03.2010 12:20
kumarp
Цитата:

Цитата: Тогда просто сосчитай их
Спасибо, пока так и сделаю. Смущает лишь сильная зависимость времени исполнения от количества выбранных файлов.
Автор: 01MDM
Дата сообщения: 27.03.2010 12:28
lorents

Цитата:
как раз XP Home, да не повезло мне

Я, когда пользовался XP Home, многие утилиты просто перенс с XP Pro. Все работало. Так же можно воспользоваться сторонними программами. Например PSTools

Автор: kumarp
Дата сообщения: 27.03.2010 12:30
wolf0425,
спасибо, пробую внедрить

все ок. то что надо, спасибо, wolf0425
Автор: rdenk1
Дата сообщения: 27.03.2010 12:38
Вот такая строка почему-то не работает:
For /R %%i not (In (0.7z, 1.7z, %variable%.7z)) Do (ren %%i 2.7z)
Как это правильнее записать?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

Предыдущая тема: XP не видит второй раздел на съемном USB-HDD


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.