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

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

Автор: Nagual
Дата сообщения: 23.05.2011 20:05
lorents
кинул бы файл куда нить, а то вслепую тяжко работать)
Автор: lorents
Дата сообщения: 23.05.2011 20:12
Nagual
не подумал об этом
http://rghost.ru/7603631
Автор: 01MDM
Дата сообщения: 23.05.2011 20:17
lorents
Найти ее, что-нибудь:

Код:
@echo off
setlocal

for /f "tokens=*" %%i in (' findstr /b "zc:.*" 1.txt ') do set "str=%%i"

...
Автор: yurkesha
Дата сообщения: 23.05.2011 20:24
lorents
Цитата:
у меня текстовой файл, и там эта сточка лежит неизвестно где
Ну отпарси файл отфильтровав его по конвееру на предмет включения подстрок через FIND или FINDSTR(для FINDSTR можно регулярку задействовать).



Добавлено:
01MDMну что-то в этом роде - хотя заложиться на zc: в начале строки это вряд ли достаточно...

Добавлено:
Если не серьезная регулярка то как минимум надо пустить конвеером последовательный отбор всех постоянных лексем из выражения zc:# zm:# zs:# fs:# f:# IDAT=# file=
Автор: Nagual
Дата сообщения: 23.05.2011 20:30
lorents
Код:
for /f "tokens=4,6 delims=: " %%a in ('more pnglog.txt^|findstr/b/c:"zc:"') do @echo zm="%%a" zs="%%b"
Автор: 01MDM
Дата сообщения: 23.05.2011 20:39
yurkesha

Цитата:
хотя заложиться на zc: в начале строки это вряд ли достаточно...

В данном конкретном случае можно просто взять последнюю строку. Да и zc там ( в pnglog.txt ) только одна.
Автор: yurkesha
Дата сообщения: 23.05.2011 20:51
01MDM
Ты смотришь один конкретный файл, не зная каким образом он создается/пересоздается и что в нем будет в следующий раз (постоянен ли например регистр, а то вдруг нет)...
Хотя если lorents устроит такой код то ему виднее...

Nagual
Вариант 01MDM явно более универсальный он ищет не просто zc в любой строке, а именно в начале, притом с добавлением двоеточия и заложена непустота после выражения...


Автор: 01MDM
Дата сообщения: 23.05.2011 20:59
yurkesha

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

В общем ты конечно прав. От более полного шаблона хуже не станет.
Автор: Nagual
Дата сообщения: 23.05.2011 21:01
yurkesha
слегка уточнил код, хотя сомневаюсь, что оно сильно надо

Добавлено:
лучше бы написал свою регулярку, чем коментить нас)
Автор: lorents
Дата сообщения: 23.05.2011 21:07
Nagual
Все работает, спасибо большое
Автор: Engraf
Дата сообщения: 23.05.2011 21:08
Мож кому интересно будет...
Бат-ник скачивает с нескольких ftp-серверов файлы с определенным расширением.
Параметры доступа, расширения и пути берутся из текстового файла [more=Следущего вида:][no][Host1]
Host=ftp1.domain.com
Login=user1
Pass=pass1
FileExt=txt
Path=D:\DWNL\1

[Host2]
Host=ftp2.domain.com
Login=user2
Pass=pass2
FileExt=doc
Path=D:\DWNL\2

[Host3]
Host=ftp3.domain.com
Login=user3
Pass=pass3
FileExt=xls
Path=D:\DWNL\3[/no][/more]

Сам батник [more=вот:][no]@echo off
echo/Processing...

rem Файл с параметрами:
set "ini=script.ini"

set "log=script.log"
set "flag=0"
set "host=0"
set "login=0"
set "pass=0"
set "mask=txt"
set "dest=%CD%"
echo/=%date% %time:~0,-3% Batch start===>>%log%

setlocal ENABLEDELAYEDEXPANSION

for /F "tokens=1,2 delims==" %%A in (!ini!) do (
set "str=%%A"
if "!str:~0,1!" equ "[" (
@if "!str:~-1!" equ "]" (
@if "!flag!" equ "1" (
echo/Section !section!>>%log%
if not "!host!" equ "0" (curl --ftp-pasv -l ftp://!host! -u !login!:!pass!>list.ftp 2>>nul)
set/A "files=0"
for /F "usebackq tokens=*" %%i in (`findstr /R .*\.!mask! list.ftp`) do (set/A "files=!files!+1")
if "!files!" equ "0" (
echo/ There are no new files>>%log%
) else (
echo/ Found new files: !files!>>%log%
set/A "files=0"
for /F "tokens=1,2 delims=." %%a in (list.ftp) do (
if "%%b" equ "!mask!" (
curl --ftp-pasv -u !login!:!pass! -o !dest!\%%a.!mask! ftp://!host!/%%a.!mask! -Q "-DELE %%a.!mask!">>nul 2>>&1
if ERRORLEVEL 0 set/A "files=!files!+1"
)
)
echo/ Files loaded: !files!>>%log%
)
set "section=%%A"
) else (
set "flag=1"
set "section=%%A"
)
)
)
if "%%A" equ "Host" (
set "host=%%B"
) else if "%%A" equ "Login" (
set "login=%%B"
) else if "%%A" equ "Pass" (
set "pass=%%B"
) else if "%%A" equ "FileExt" (
set "mask=%%B"
) else if "%%A" equ "Path" (
set "dest=%%B"
)
)
pause
rem ====Execute last section====
echo/Section !section!>>%log%
if not "!host!" equ "0" (curl --ftp-pasv -l ftp://!host! -u !login!:!pass!>list.ftp 2>>nul)
set/A "files=0"
for /F "usebackq tokens=*" %%i in (`findstr /R .*\.!mask! list.ftp`) do (set/A "files=!files!+1")
if "!files!" equ "0" (
echo/ There are no new files>>%log%
) else (
echo/ Found new files: !files!>>%log%
set/A "files=0"
for /F "tokens=1,2 delims=." %%a in (list.ftp) do (
if "%%b" equ "!mask!" (
curl --ftp-pasv -u !login!:!pass! -o !dest!\%%a.!mask! ftp://!host!/%%a.!mask! -Q "-DELE %%a.!mask!">>nul 2>>&1
if ERRORLEVEL 0 set/A "files=!files!+1"
)
)
echo/ Files loaded: !files!>>%log%
)
endlocal
del /Q *.ftp
echo/===Batch over %time:~0,-3%===>>%log%
echo.>>%log%[/no][/more]
Очевидная недоработка - не умеет качать файлы с любым расширением. Для моих целей этого не надо было, а так работает. (Работа с ФТП в пассивном ржиме)

Забыл сказать: использется утилита curl.exe
Автор: yurkesha
Дата сообщения: 23.05.2011 21:15
Nagual
Я в регулярка не силен поэтому и пытался подвинуть тех кто силен на написание...
Я бы решал примерно так:
Код: findstr /b "zc:.*" 1.txt|findstr "zm:"|findstr "zs:"|findstr "fs:"|findstr "f:"|findstr "IDAT="|findstr "file="
Автор: Free_Soft
Дата сообщения: 23.05.2011 22:23
как можно скопировать файл на все существующие диски, кроме съемных, или хотя бы кроме флешек?
Автор: Nagual
Дата сообщения: 23.05.2011 22:36
yurkesha
слишком заморочено, лучшее враг хорошего)
Free_Soft
как будем определять диски? указываем списком напрямую? или как-то читаем с реестра?
куда именно закачивать файл? в корень?
Автор: yurkesha
Дата сообщения: 23.05.2011 22:46
Nagual
Помнится мне раньше и SET-ы все без кавычек писались
Но уже часть людей на автомате начала использовать SET "PAR=BLABLABLA"
Я вот надеюсь что желание писать коректно в итоге победит и добавка пробелов в концы строк кода таки не будет никому больше мешать...
Лучшее враг хорошего только тогда когда есть хорошее - то есть корректный и устойчивый код который с большой долей вероятности не упадет на некорректных данных.
Автор: Free_Soft
Дата сообщения: 23.05.2011 23:07
Nagual
просто перебираем существующие. копируем в корень
Автор: 01MDM
Дата сообщения: 23.05.2011 23:16
Free_Soft

Цитата:
как можно скопировать файл на все существующие диски, кроме съемных, или хотя бы кроме флешек?

Определить разделы на _жестких_ дисках ( не флешках ) можно так:

Код:
@echo off
setlocal

set "wmic=wmic logicaldisk where drivetype="3" get name"
for /f "skip=1" %%i in (' "%wmic%" ') do echo %%i
Автор: wolf0425
Дата сообщения: 24.05.2011 07:36
lorents
Цитата:
zc:# zm:# zs:# fs:# f:# IDAT=# file=#
где # - некие числа, при этом все они разные.
подскажите, пожалуйста, как можно узнать значения чисел при zm: и zs: ?

Цитата:
но вопрос тот же, я не знаю где эта сточка находится.

это единственная строка файла, начинающаяся на zc: - остальные указанные выше признаки точно нужны для фильтрации?

Код: for /f "tokens=4,6,* delims=:    " %%a in (' findstr /i /b /c:"zc:" pnglog.txt ') do echo.zm=%%a zs=%%b
Автор: Nagual
Дата сообщения: 24.05.2011 11:24

Цитата:
при копировании внимательнее - после delims=: идет одна табуляция.

полностью согласен
ладно, дожмём уж до конца)
Код:
for /f "tokens=4,6 delims=: " %%a in ('findstr /r /i /b /c:"zc:..zm:..zs:" pnglog.txt') do @echo.zm="%%a" zs="%%b"
Автор: Free_Soft
Дата сообщения: 24.05.2011 11:28
файл создается по адресу
Код: \\?\Volume{b519cc4e-2590-11e0-b890-806e6f6e6963}\\reset.cmd
Автор: res2001
Дата сообщения: 24.05.2011 14:37
Free_Soft

Цитата:
как можно из батника узнать букву диска, с которого он запускается?

%~d0

Цитата:
Цикл не срабатывает.

Думаю, что срабатывает.
Убери @echo off в батнике и посмотри общий ход выполнения, там все будет видно, можешь перенаправить вывод в файл, чтоб удобней было смотреть.
Автор: Free_Soft
Дата сообщения: 24.05.2011 14:53
res2001

Код: %~d0
Автор: res2001
Дата сообщения: 24.05.2011 15:06
Free_Soft

Цитата:
по поводу хитрого пути

Думаю что команда attrib не умеет работать с такими путями, а copy работает, отсюда и ошибки при присваивании аттрибутов.
Где-то в дебрях реестра есть инфа о том на какую букву диска спланироват это твой хитрый путь, можно оттуда выдернуть. Где именно в реестре это находится - не в курсе, но думаю, легко найти по номерку.
Другой вариант - присваивать атрибуты до копирования.
Автор: wolf0425
Дата сообщения: 24.05.2011 15:21

Цитата:
Где-то в дебрях реестра есть инфа о том на какую букву диска спланироват это твой хитрый путь, можно оттуда выдернуть.
он вообще-то может быть и ни на какую букву не подмонтирован, информацию о монтировании выдает mountvol



Автор: Free_Soft
Дата сообщения: 24.05.2011 15:23
res2001
файл создается по этому пути через >>. А копирование я имел ввиду наоборот из этого расположения, а не в. Да буквы может не быть... вообще это все творилось ради создания файла в разделе, зарезервированном системой. у него буквы как известно нет. pushd тоже не работает, пробовал...
Автор: res2001
Дата сообщения: 24.05.2011 15:52
Free_Soft
Вроде ты там про атрибуты писал сначала, теперь уже их не надо менять?
Копирование нормально проходит, в общем в чем вопрос то.
Автор: Free_Soft
Дата сообщения: 24.05.2011 15:57
res2001
брр.. извиняюсь за возможную сумбурность. задача присвоить файлу по этому пути атрибут системного и затем скопировать его в другое место с сохранением атрибута
Автор: res2001
Дата сообщения: 24.05.2011 16:00
Free_Soft
Ну и скопируй, а потом присвой.

Добавлено:
если уж тебе сильно надо чтоб в том разделе лежал файл с системным атрибутом, то скопируй, присвой, скопируй обратно с перезаписью.
Автор: Free_Soft
Дата сообщения: 24.05.2011 16:07
res2001
так не удается этому

Код: \\?\Volume{b519cc4e-2590-11e0-b890-806e6f6e6963}\\reset.cmd
Автор: 01MDM
Дата сообщения: 24.05.2011 16:27
Free_Soft
А зачем такие пути? Может обойтись нормальными, с буковками?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

Предыдущая тема: зависает установка Windows XP: 39 минут


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