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

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

Автор: Dimosik_parovozik
Дата сообщения: 26.02.2009 22:59
Дело в том что программа минимайзер никак не связана со скайпом, она дает возможность сварачивать quake, и будут ли какие изменения всвязи с этим?
Автор: Elroir
Дата сообщения: 26.02.2009 23:14
metrim

Цитата:
На первый взгляд - генерируется временный файл из которого потом вычищются наличествующие файлы/ссылки?

Да, именно так. Сначала создается файл со всеми возможными ссылками (all_range.txt), потом создается файл с тем, что уже есть на диске (local.txt), а потом в файл download.txt записываются все ссылки из первого файла, которые не содержат названий файлов из pre.txt и из local.txt.


Цитата:
Жаль что без комментариев программа, но попробую разобраться.
путь к файлу (ссылка) формируется следующим образом:
http://домен/1-4цифры/5,6цифры/весь номер



Код:
@echo off
setlocal enabledelayedexpansion
:: Вносим в переменную то, что было передано аргументом ком. строки
set "start=%~1"
:: Определяем вспомогательную переменную для подсчета кол-ва ведущих нулей
set "position=0"
:: В следующем блоке, находим количество ведущих нулей и
:: определяем переменную prefix с этими нулями
:find_prefix
if "!start:~%position%,1!"=="0" (
set "prefix=!prefix!0"
set /a "position+=1"
goto :find_prefix
)
:: в переменную "_start" записываем начальный индекс без ведущий нулей
set "_start=!start:~%position%!"
:: в переменную "_end" записываем конечный индекс
set /a "_end=_start+100000"
:: стираем файл "all_range.txt" (если он существует) и создаем его заново - со всеми возможными ссылками
del /q all_range.txt 2>nul & for /l %%a in (%_start%,1,%_end%) do (
:: прибавляем ведущие нули к индексу
set "whole_number=%prefix%%%a"
:: записываем полную ссылку в файл
echo http://domen/!whole_number:~0,4!/!whole_number:~4,2!/!whole_number!.file>>all_range.txt
)
:: стираем файл "local.txt" (если он существует) и создаем его заново - со всеми уже существующими файлами
del /q local.txt 2>nul & for /f "tokens=*" %%a in ('dir /b "C:\Temp\Downloaded\*.file"') do echo %%~nxa>>local.txt
:: фильтруем all_range.txt
type all_range.txt | findstr /v /g:pre.txt | findstr /v /g:local.txt>download.txt
del /q all_range.txt 2>nul
del /q local.txt 2>nul
Автор: wolf0425
Дата сообщения: 27.02.2009 03:03
K_AHTOH

Цитата:
Пропускать обработку файла который создан сегодня (по аналогии удаления старых файлов)

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

если нужно проверить %1 на текущую дату модификации - зачем накручивать построчный разбор лога, и наоборот...
Автор: Herissen
Дата сообщения: 27.02.2009 06:05
спасибо люди добрые одну часть проблемы решил ))
теперь подскажите правельные параметры для утилиты cmdow что бы скрыть окно выполнения.
и еще просьба как сделать так чтобы батник автоматом запускался и не был виден в диспечере задач и автозагрузке
с уважением
Автор: ikif
Дата сообщения: 27.02.2009 06:29
Помогите плз, застрял с одной фигней.
[more]
GOTO start
:start
for /F "tokens=2 delims=: skip=2" %%a in ('ipconfig ^| findstr "IP"') do (if not defined myip set myip=%%a)
find /i "%myip%" < Spisok>NUL
IF "%errorlevel%"=="0" (
RECONNECT
rasdial "prov" /disconnect
PING 1.1.1.1 -n 1 -w 8000 >NUL
rasdial "Prov" user pass
GOTO start
) ELSE (
echo %myip% >>Spisok
)
[/more]

Проблема в том, что даже если АЙ ПИ уже новый, то с FOR получаем каждый раз , АЙ ПИ , который был получен в первый раз.
Похоже , что в FOR не заходит снова, даже если я к этому принуждаю.
Помогите плз
Автор: Maza_Faka
Дата сообщения: 27.02.2009 06:32
Herissen

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


Код:
CMDOW @ /HID
::Ваш код...
Автор: Herissen
Дата сообщения: 27.02.2009 06:41

Цитата:
Ну в диспетчере по любому будет виден процесс cmd.exe, разве, что скомпилировать батник в exe-файл с каким нибудь "страшным" именем, что-то вроде svchost.exe


да ладно бог с ним в деспечере ))) пусть весит.
как сделать автозагрузку файла, но чтобы он не отображался в пункте автозагрузка
Автор: K_AHTOH
Дата сообщения: 27.02.2009 08:29
Началось все отсюда
Все работает но есть одно НО. Файл который сформирован сегодняшней датой нельзя передовать на обработку.
Хотел сделать по аналогии удаления старых файлов, вот так:

Код: for /F "tokens=1 delims=;" %%d in ('findstr /L /I /C:"%1" %logfile%') DO (echo %%~ti | findstr /v %date% 1>nul && call :wrk %1)
Автор: wolf0425
Дата сообщения: 27.02.2009 09:09
K_AHTOH, какие-то разброд и шатания у тебя в батнике
ECHO %date:~-10% %time:~,5% %1 >> %LOGFILE%
имяфайла - третий столбец, разделение столбцов - пробелами

for /F "tokens=1 delims=;" %%d in ('findstr /L /I /C:"%1" %logfile%') DO (echo %%~ti | findstr /v %date% 1>nul && call :wrk %1)
%%i - шестой столбец лога (при первом %%d), разделитель столбцов - ";" (идейно более правильный, чем пробел, но несовпадающий с форматом echo)

в строке перед SET "SEEKIN потерян && перед goto. Кривой копипасте?
ну и хотя в данном случае некритично, но перед меткой :wrk не помешала бы строка goto :eof

в :chk parser.exe надо вызвать только когда %1 не сегодняшний и его нет в %logfile% ?
наворочено то... заменяешь свою :chk на то что ниже, саб :wrk выкидываешь, проверяешь.

:chk
set "data1=%~t1"
if "%data1:~0,10%"=="%data%" goto :eof
findstr /L /I /C:"%~1" %logfile% >nul && goto :eof
ECHO FOUND NEW FILE %1
D:\parser.exe -tfsfile "%~1" -outdir !Outputdir!
if errorlevel 0 ECHO %date:~-10% %time:~,5% %1 >> %LOGFILE%
goto :eof

Кстати, а то что в лог никак не заносятся те файлы, на которых парсер был запущен и вернул ошибку - так и надо?
Автор: K_AHTOH
Дата сообщения: 27.02.2009 09:46
wolf0425

Цитата:
в строке перед SET "SEEKIN потерян && перед goto. Кривой копипасте?

Нет. Работает без него. (

Цитата:
в :chk parser.exe надо вызвать только когда %1 не сегодняшний и его нет в %logfile% ?

Да именно так.

Цитата:
Кстати, а то что в лог никак не заносятся те файлы, на которых парсер был запущен и вернул ошибку - так и надо?

Он не возвращает ошибки к сожалению. Точнее всегда "0"

вот как отработало все


Код: C:\log\>if errorlevel 0 ECHO 27.02.2009 10:30 L:\comlog_26_02_200
9.tfs 1>>logfil.txt

C:\log\>goto :eof

C:\log\>call :chk L:\comlog_27_02_2009.tfs

C:\log\ "data1=27.02.2009 10:23"

C:\log\>if "27.02.2009" == "" goto :eof

C:\log\>findstr /L /I /C:"L:\comlog_27_02_2009.tfs" logfil.txt
1>nul && goto :eof

C:\log\>ECHO FOUND NEW FILE L:\comlog_27_02_2009.tfs
FOUND NEW FILE L:\comlog_27_02_2009.tfs

C:\log\>C:\M-200\callbuilder\parser.exe -tfsfile "L:\comlog_
27_02_2009.tfs" -outdir "C:\Log"
Автор: wolf0425
Дата сообщения: 27.02.2009 10:02
Работает без него.
ага, работает - пока диск мапится. А если не замапится - прервется правильно?

а, у меня описка вылезла,
if "%data1:~0,10%"=="%date%" goto :eof
Автор: K_AHTOH
Дата сообщения: 27.02.2009 10:25
wolf0425
Спасибо!! Теперь все вроде работает.

Цитата:
ага, работает - пока диск мапится. А если не замапится - прервется правильно?

Поставил... && Но там проблема... Если диск уже был открыт с такой буквой... Пока не знаю что делать.
Автор: wolf0425
Дата сообщения: 27.02.2009 10:34
Если диск уже был открыт с такой буквой... Пока не знаю что делать.

for %%a in ( m n o p q r s t u v w x y z ) do if not exist %%a:\nul set "netdisk=%%a:" && goto :setdisk
echo Cannot assighn disk && goto :eof
:setdisk
Автор: K_AHTOH
Дата сообщения: 27.02.2009 12:53
wolf0425
Спасибо!!!
Откатаю и выложу батник с описанием.
Автор: wolf0425
Дата сообщения: 27.02.2009 13:29
K_AHTOH
кстати, при мапинге на разные буквы вылезет еще бага - в лог пишется полный путь файла, и при разных мапингах прописанный поиск по логу %1 - обломится.
правка сравнения:
findstr /L /I /C:"%~pnx1" %logfile% >nul && goto :eof
интересно -сколько еще багов
Автор: K_AHTOH
Дата сообщения: 27.02.2009 13:48
wolf0425
Спасибо только что увидел
Т.к. парсер запустился по новой
Автор: Kilyan
Дата сообщения: 27.02.2009 14:01
Требуется организация батника!
В разделе реестра HKLM\SOFTWARE\microsoft\windows\curentversion\uninstall\
существуют разделы для удаления программ, например такого вида {7f....db527}
в которых несется информация о продукте (publisher) и ключ для удаления (uninstallString)
Как найти необходимый продукт из массы {7f....db527} со строковым параметром (publisher) и при нахождении вытянуть строковый параметр для удаления (uninstallString)
Очень нужно - ПОМОГИТЕ!
Автор: K_AHTOH
Дата сообщения: 27.02.2009 14:45
Все работает
Вот что в итоге у меня получилось:

Код: :: Скрипт предназначен для обработки файлов внешней программой
:: расположенных на удаленном компьютере с общим доступом.
:: После обработки файлы заносятся в список обработанных и больше не обрабатываются
:: Не обрабатывается также файл с текущей датой.
::
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

:: Путь к источнику файлов
set "SourceDir=\\192.168.01.01\folder"
:: Домен\Логин
set "domean_login=dom\sysadmin"
:: Пароль
set "password=1234567"
:: Outputdir - директория вывода обработанных файлов
set "Outputdir= C:\LOG\"
:: Путь к программе парсера
set "parser= C:\parserdir\"
:: logfile.txt - файл, гда хранятся имена обработанных ранее файлов
set "logfile=logfil.txt"
:: Определяем свободную букву для подключаемого диска
for %%a in ( m n o p q r s t u v w x y z ) do if not exist %%a:\nul set "netdisk=%%a:" && goto :setdisk
echo Cannot assighn disk && goto :eof
:setdisk
:: Подключаем сетевой диск
net use %netdisk% %SourceDir% /user:%domean_login% %password%
If Not "!ErrorLevel!"=="0" ECHO %date:~-10% %time:~,5% Сетевой ресурс не доступен >> %LOGFILE% &&goto :eof
:: *.tfs фильтр по расширению файла
SET "SEEKIN=%netdisk%\*.tfs"
for %%f in (!SEEKIN!) DO call :chk %%f
:: ====== Завершение работы =====
:: отключаем сетевой диск
net use %netdisk% /delete /yes
:: очистка от мусора
IF EXIST %Outputdir%*.err del %Outputdir%*.err
IF EXIST %Outputdir%*.rm3 del %Outputdir%*.rm3
IF EXIST %Outputdir%*.jrn del %Outputdir%*.jrn
goto :eof

:chk
set "data1=%~t1"
if "%data1:~0,10%"=="%date%" goto :eof
findstr /L /I /C:"%~pnx1" %logfile% >nul && goto :eof
::ECHO FOUND NEW FILE %1
:: Запуск программы парсера (-tfsfile -outdir ключи парсера)
%parser%parser.exe -tfsfile "%1" -outdir !Outputdir!
if errorlevel 0 ECHO %date:~-10% %time:~,5% %1 >> %LOGFILE%
)

:wrk
if not "%1"=="" SET "NEW=0"
Автор: ikif
Дата сообщения: 27.02.2009 14:56
Помогите плз, застрял с одной фигней.

Код:
GOTO start
:start
for /F "tokens=2 delims=: skip=2" %%a in ('ipconfig ^| findstr "IP"') do (if not defined myip set myip=%%a)
find /i "%myip%" < Spisok>NUL
IF "%errorlevel%"=="0" (
RECONNECT
rasdial "prov" /disconnect
PING 1.1.1.1 -n 1 -w 8000 >NUL
rasdial "Prov" user pass
GOTO start
) ELSE (
echo %myip% >>Spisok
)
Автор: Elroir
Дата сообщения: 27.02.2009 16:07
ikif
Убери из строчки for-a "if not defined myip"
Автор: ikif
Дата сообщения: 27.02.2009 16:17

Цитата:
Elroir


Спасибо огромное.
Автор: bashik
Дата сообщения: 27.02.2009 19:09
здравствуйте уважаемые.
помогите с проблемкой - как заставить for /f разобрать только 1 строку из текстового файла?
ситуация - есть 2 папки, в одной лежат нужные файлы, в другой есть файлы с таким же названием и куча других. задача - переместить файлы совпадающие с названиями в 1 папке в третью папку, а из первой во вторую. просто копировать из 1 во вторую нельзя, так как файлы заняты процессом и заменять себя не дают (зато дают перемещать).
пробовал получать список файлов и разбирать его через for /f

@echo off
dir /b files\patch >files\dir.txt
for /f "tokens=1 delims=*" %%i in (files\dir.txt) do echo %%i >files\tmp.txt    
pause

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

Автор: ponand
Дата сообщения: 27.02.2009 22:08
bashik

Цитата:
@echo off
dir /b files\patch >files\dir.txt
for /f "tokens=1 delims=*" %%i in (files\dir.txt) do echo %%i >files\tmp.txt
pause

попробуй так

Код:
@echo off
For /F %%i in ('dir files\patch\ /b') do echo %%i >>files\tmp.txt
pause
Автор: wolf0425
Дата сообщения: 28.02.2009 04:05
K_AHTOH
вот что в итоге у меня получилось:
похоже все на месте, хотя некоторое количество мусора осталось:

блок :wrk в конце - никому не нужен (но и ничего не портит)

блок :chk должен завершаться не закрывающей скобкой (к которой давно уже нет открывающей) а строкой goto :eof - это просто для предсказуемости, вдруг через месяц/год еще какую подпрограмму в конец файла допишешь.

ну и переменные в !! ( !SEEKIN! ) используются без необходимости, сгодились бы и в %%. но это косметика
Автор: bashik
Дата сообщения: 28.02.2009 06:45
ponand

Цитата:
@echo off
For /F %%i in ('dir files\patch\ /b') do echo %%i >>files\tmp.txt
pause

попробовал...

Цитата:
@echo off
For /F %%i in ('dir files\patch\ /b') do set dir=%%i >>files\tmp.txt
copy system\%dir% files\client
pause

в результате копируется последний файл из 11, хотя в темп пишет все 11.
Автор: king_stiven
Дата сообщения: 28.02.2009 07:38
bashik

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


Код: for /f "tokens=*" %%e in ('dir "folder1" /b /a:-d') do (
MOVE "folder2\%%e" "folder3"
MOVE "folder1\%%e" "folder2"
)
Автор: bashik
Дата сообщения: 28.02.2009 09:43
king_stiven
большое спасибо. работает.
Автор: K_AHTOH
Дата сообщения: 28.02.2009 11:26
wolf0425
Большое спасибо за помощь! (косметику поправлю)

У меня теперь другая проблема
Как запустить несколько экземпляров скриптов (со своими настроками) на удаленной машине под своей учетной записью?
Понимаю что можно написать батник и перечислить нужные скрипты, но тогда они будут выполнятся последовательно (пока не закончит выполнятся один второй не запустится).
Запускать нужно в шедулере. А та больше 2- процессов не получается запустить (система блокирует учетку.
Можно как нибудь из 1-го батника сразу запустить несколько параллельно?
Автор: wolf0425
Дата сообщения: 28.02.2009 11:41
э... а какие проблемы? что -
start "title1" script1.cmd
уже не запускает параллельно работающее окно?
Автор: K_AHTOH
Дата сообщения: 28.02.2009 11:49
wolf0425
Запускает наверно... Я про нее и спрашивал .

Спасибо.

Добавлено:
Нет все же эту комманду надо как то по другому использовать...
Скрипт в итоге из шедулера запускается только 1 почемуто файл со списком обработанных ложится прямо возле этого общего пусковика.
Я так подозреваю что система не дала открыть еще один сеанс ...
Т.е. 1 общий пускатель 2. первый скрипт и все дальше ничего не работает.

Добавлено:
Вот общий запускатель :

Код: start "Старт 1 парсера" "D:\1926\parser\parser1.cmd"
start "Старт 2 парсера" "D:\2090\parser\parser2.cmd"

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: как сохранить сетевые настройки


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