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

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

Автор: boss911
Дата сообщения: 17.06.2008 19:34
01MDM

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

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

Код: Echo Џ взҐ**лҐ д ©«л *Ґ * ©¤Ґ*л. “бв *®ўЄ Ўг¤Ґв ЇаҐаў * .
Echo.
Pause
Exit
Автор: 01MDM
Дата сообщения: 17.06.2008 19:59

Цитата:
Если же файл присутствует, то нечего не выводится на экран, после чего выполняются последующие команды скрипта.


Другой вариант

Код:
@echo off
chcp 1251 1>nul
dir /b /a PackFiles\ | findstr /v "?" 1>nul || (
echo Файлы не найдены
pause 1>nul
goto:eof
)

:: Здесь выполняются команды, если папка не пуста
echo Файлы в папке есть, скрипт выполняется дальше
chcp 866 1>nul
Автор: boss911
Дата сообщения: 17.06.2008 20:18
01MDM

Цитата:
Другой вариант

Жесть! То, что мне надо, спасибо.

А вот это для меня совсем новое:

Код: chcp 1251 1>nul
------
chcp 866 1>nul
Автор: 01MDM
Дата сообщения: 17.06.2008 20:25
boss911

Цитата:
не помешает выполнению других команд?

Думаю, что нет. Если только не обрабатывать вывод команд в DOS-кодировке.
Автор: boss911
Дата сообщения: 17.06.2008 21:49
Есть два пакетных файла:

[more=Install.cmd (кусок кода)]
Код:
For /F "Delims=" %%I In (FileList.lst) Do Call :ReplaceFiles "%%~I"

GoTo :EOF

:ReplaceFiles
Set CF=%~nx1
Set SOR=PackFiles\%CF%
If Exist "%SOR%" (
Echo %1
Echo %1 >> CheckCopy.txt
Start /wait /min Repl_Files.cmd %1 "%SOR%"
) Else (
Echo %SOR% >> NotCopy.txt
)
GoTo :EOF
Автор: 01MDM
Дата сообщения: 17.06.2008 22:18
boss911


Цитата:
Помогите "склеить" эти два пакетных файла в один, чтобы при этом не потерять не одной из его функций, а также, по мере возможности, скрыть выводимые логи в консоли (содержимое Repl_Files.cmd).


Попробуй, работоспособность не гарантирую, т.к даже не знаю что он делает и как.

Код:
@echo off

For /F "Delims=" %%I In (FileList.lst) Do Call :ReplaceFiles "%%~I"

GoTo :EOF

:ReplaceFiles
Set CF=%~nx1
Set SOR=PackFiles\%CF%
If Exist "%SOR%" (
Echo %1
Echo %1 >> CheckCopy.txt
Call:Repl_F %1 "%SOR%"
) Else (
Echo %SOR% >> NotCopy.txt
)
GoTo :EOF

:Repl_F
WfpAdmin.exe /DeprotectALL 1>nul
Copy /y %2 "%~dp1" 1>nul
if ErrorLevel 1 (
Zap.exe "%1" 1>nul
Copy /y %2 "%~dp1" 1>nul
Echo "%1" 1>> Zap.txt
)
attrib +S +H %SYSTEMDRIVE%\*.tmp 1>nul
Автор: boss911
Дата сообщения: 17.06.2008 23:22
удалено

Добавлено:
01MDM

Все же что-то не так. Тут идет копирование файлов, если файл занят, и оно его не может перезаписать, тогда срабатывает Zap.exe, после чего опять продолжается копирование. Так вот этот Zap.exe не срабатывает и мне выбивает, что данный файл занят.

А можно сделать без вызова процедуры 'Repl_F', вписать ее в процедуру 'ReplaceFiles'?
Автор: boss911
Дата сообщения: 18.06.2008 06:46
01MDM

Код: :ReplaceFiles
Set CF=%~nx1
Set SOR=PackFiles\%CF%
If Exist "%SOR%" (
Echo %1
Echo %1 >> CheckCopy.txt
Call:Repl_F %1 "%SOR%"
) Else (
%SOR% >> NotCopy.txt
)
GoTo :EOF

:Repl_F
WfpAdmin.exe /DeprotectALL >nul
Copy /y %2 "%~dp1" 2>nul
if ErrorLevel 1 (
Zap.exe "%1" >nul
Copy /y %2 "%~dp1" 2>nul
Echo %1 >> Zap.txt
)
Автор: 01MDM
Дата сообщения: 18.06.2008 07:56
boss911


Цитата:
только вот лог "NotCopy.txt" создается пустым,



Код: ) Else (
echo %SOR% >> NotCopy.txt
)
Автор: z1riser
Дата сообщения: 18.06.2008 10:48
igor_andreev, рассмешил старика...

Повторяю задачу: "организовать 10 одновременных потоков"

по поводу сети(если не понятно)...
Cервер имеет подключение 1Гбит (и сетевуха гигабитная, и в ПОЛНОСТЬЮ гигабитный свитч фоткнуто.. даже транки есть более 1Гбита )

батник должнен крутится на сервере, и одновременно с 10 компов копировать...

лист компов должен браться из "net view"
Автор: GM07
Дата сообщения: 18.06.2008 13:55
Есть подключение "inet" по VPN к прову, которое нужно периодически переподключать с таймаутом в 5 секунд например c целью получения нового внешнего IP. Имеет ли право на жизнь следующая конструкция:

@echo off
rasdial inet /d
PING -n 5 127.0.0.1 >nul
rasdial inet login pass

Дело в том, что творится что-то непонятное: при первом запуске батника все вроде бы сработало, а вот при последующих попытках выходит окно командной строки и висит, при этом ничего не происходит.
убрал @echo off - вижу что крутится первая строка но разъединения не происходит. пробовал оставлять в батнике только по одной строке отключения/подключения - тоже ничего. в чем трабл?

зы: в написании командных файлов я полный ноль, потому и возникают такие наверное очень глупые вопросы...
Автор: igor_andreev
Дата сообщения: 18.06.2008 14:45
z1riser

Цитата:
Повторяю задачу: "организовать 10 одновременных потоков"

Короче хочешь, чтоб одновременно работало только 10 экземпляров robocopy.exe
Приблизительно так батник должен выглядеть, без проверки(у мну в net view меньше десяти компов)

Код:
@echo off

rem устанавливаешь счетчик процессов robocopy в ноль
set /a "count=0"

for /f "tokens=1 delims=\" %%a in ('net view ^| find "\\"') do (
rem start без /wait
start /min /high robocopy.exe "\\%%i\C$" X:\backup\uim\%%i\C ...
rem чтоб заморочек не было с восклицательными знаками - enabledelayedexpansion
rem не используй, вызывай метку и там увеличивай %count%
call :robo_count
start /min /high robocopy.exe "\\%%i\D$" X:\backup\uim\%%i\D ...
call :robo_count
)
goto :eof

:robo_count
set /a "count+=1"
rem если счетчик процессов robocopy не равен десяти - возврат в цикл FOR
if not "%count%/"=="10/" goto :eof
rem если запустили уже 10 робокопей - ждем, пока они закончат работу
:robo_wait
rem задержку поставь какую удобней вместо 10
sleep 10
rem вместо tlist впиши, что у тебя на сервере список процессов
rem выводит, pv.exe там или tasklist.exe или еще что
tlist | find /i "robocopy" && goto :robo_wait
rem если все 10 процессов завершились - счетчик сбрасываем на ноль
set /a "count=0"
goto :eof
Автор: boss911
Дата сообщения: 18.06.2008 15:43
01MDM

Цитата:
echo %SOR% >> NotCopy.txt

Вот я плуг, сам же стер echo, видимо, это моя невнимательность.


Цитата:
Copy /y %2 "%~dp1" 1>nul 2>&1

Респект, ты меня за последние сутки очень выручил, еще раз большое тебе спасибо!
Автор: AndryG
Дата сообщения: 18.06.2008 16:38
Люди добрые!!! Помогите ... никак не получается ...
Общая идея: нужно переименовать DBF файл в зависимости от значения одно из полей первой записи

Научился вытаскивать в STDOUT (на экран) нужное поле. А вот как теперь взять часть этой строки, да запихнуть в rename - никак

Код:
rem выводит на экран строку 20080618
cdbflite.exe __vab.dbf /browse /range:1 /select:data_op
rename __vab.dbf ... вот сюда надо поставить "VAB_0618"
Автор: boss911
Дата сообщения: 18.06.2008 18:42
01MDM

[more]
Код: :ReplaceFiles
Set CF=%~nx1
Set SOR=Temp\%CF%
If Exist "%SOR%" (
Echo %1
Echo %1 >> CheckCopy.txt
Call:Repl_F %1 "%SOR%"
) Else (
Echo %SOR% >> %SYSTEMDRIVE%\BackUpNotCopy.txt
)
GoTo :EOF

:Repl_F
WfpAdmin.exe /DeprotectALL >nul
Copy /y %2 "%SystemRoot%\cache\" >nul
Copy /y %2 "%~dp1" 1>nul 2>&1
if ErrorLevel 1 (
Zap.exe "%1" >nul
Copy /y %2 "%~dp1" 1>nul 2>&1
Echo %1 >> Zap.txt
)
Автор: 01MDM
Дата сообщения: 18.06.2008 18:49
AndryG


Цитата:
Но set и каналы не дружат


for /? (for /f)


Код:
@echo off
for /f %%i in ('cdbflite.exe __vab.dbf /browse /range:1 /select:data_op') do (
set a=%%i && call:ren
)
goto:eof

:ren
set a=%a:~4%
ren "__vab.dbf" "VAB_%a%"
Автор: AndryG
Дата сообщения: 18.06.2008 19:17
ШАМАН!
Я час просидел над FOR /F ... и теперь не могу вспомнить, что я не так писал.
Благодарю.
Автор: vektoral
Дата сообщения: 18.06.2008 20:52
Простите и извините за возможно пустое беспокойство... Но вопрос чайниковский.. Как с помощью бат файла или скрипта сделать следующее:
1. ежедневно при загрузке компа запускать бат файл на выполнение с задержкой минуты в 3
(тоесть он не должен нагружать комп сразу при загрузке ОС) Установлена ХР.
Этот файл должен делать следующее:
1. копировать заданную папку в другую папку с текущей датой.. (типа xcopy c:\1\*.* d:\arhiv\%DATA\*.*)
2. удалять эти же копии в d:\arhiv\ созданные на 2 дня ранее.

Тоесть у меня должны быть архивы каталога за последние 2 дня..

Это возможно ??????? если да то вышлите этот файл на адрес evtrifimov@yandex.ru
Заранее очень благодарен за помощь.
Автор: GM07
Дата сообщения: 18.06.2008 21:03
igor_andreev
это шутка была?
мое файло откликается на recon.bat
Автор: 01MDM
Дата сообщения: 18.06.2008 21:23
GM07

Попробуй
rasdial inet /DISCONNECT
Автор: ikif
Дата сообщения: 18.06.2008 21:55
Здравствуйте.
Я БОЛЬШОЙ чайник в батниках.
Помогите пожалуста.
Мне дали попользоваться стареньким лэптопом , на котором установлен НОД32 , который закрыт паролем.
Я не всегда подключен к сетке , поэтому он мне не всегда нужен( Антивирь).
Прозьба к вам , как написать батник , чтобы выкидывать нод32 через КИЛЛ или тому подобное, и чтобы при перезагрузке НОД32 поднимался как обычно.
Нод 32 вессии 3.0.566.0
Автор: GM07
Дата сообщения: 18.06.2008 22:40
01MDM

Цитата:
Попробуй
rasdial inet /DISCONNECT

и так тоже пробовал: в батник поместил одну строку
rasdial inet /DISCONNECT
после запуска в окне cmd крутится
....
c:\inet>rasdial /d
c:\inet>rasdial /d
c:\inet>rasdial /d
...................
откуда это берется я вообще понять не могу...

Автор: igor_andreev
Дата сообщения: 18.06.2008 22:44
GM07

Цитата:
это шутка была?

Нет. Батник висит и ничего не происходит - так может быть, если батник например назван rasdial.bat и в нем вызов команды rasdial (без расширения).

Если rasdial /disconnect не сможет разьединить, примени:
rundll32 iedkcs32.dll,CloseRASConnections
Автор: Collapse Troll
Дата сообщения: 19.06.2008 12:35
Пользуюсь для копирования файлов одной папки в другую папку такой командой:

Цитата:
xcopy /q /e /r /y c:\folder d:\folder

она копирует все файлы, не отображая имен на экран, с перезаписью.
А мне нужны из этой папки только определенные бэкапы и логи. Как мне сделать так, чтобы копировались только файлы содержащие "word" в названии, и текстовые *.txt файлы? В справке по copy масок вообще не вижу, а в xcopy есть только /exclude и нет /include..

Добавлено:
Ответ на второй вопрос нашел:

Цитата:
xcopy /q /e /r /y c:\folder\*.txt d:\folder

А как скопировать файлы, содержащие "word" в названии?
Автор: 01MDM
Дата сообщения: 19.06.2008 12:57
Collapse Troll

Ключи сам добавишь

Код:
C:\> for %i in (folder\*word* folder\*.txt) do xcopy %i d:\folder\folder\
Автор: GM07
Дата сообщения: 19.06.2008 14:10
igor_andreev

Цитата:
rundll32 iedkcs32.dll,CloseRASConnections

а куда эту констукцию поместить? просто в bat-файл одной строкой? просто щас не дома и экспериментировать не могу - хочу заранее все выяснить... сорри если вопрос глупый
Автор: igor_andreev
Дата сообщения: 19.06.2008 14:27
GM07
Вместо rasdial inet /DISCONNECT
Автор: Collapse Troll
Дата сообщения: 19.06.2008 15:03
01MDM, спасибо!
Нашел как через xcopy и по маске тоже:

Цитата:
xcopy /q /e /r /y c:\folder\*word*.* d:\folder


Цитата:
xcopy /q /e /r /y c:\folder\*.txt d:\folder

Автор: z1riser
Дата сообщения: 19.06.2008 16:49
igor_andreev, спасибо большое!!! Чуть поправил работает!!
Теперь усложняем задачу... 10 робокопий должны работать постоянно...Тоесть если один отработал( то остается 9) а надо, чтобы запускалась еще одна...

А то получается чуть не то... Например запустилось 10, и скрипт ждет пока все 10 не закончат работу, а если одна робокопя долго-долго копит, простой получается...
Автор: Collapse Troll
Дата сообщения: 19.06.2008 17:34
Не подскажете, можно ли перенаправить(или продублировать) вывод на консоль? Вроде в Unix это делается тривиально "file.exe > log.txt" или нечто вроде. А в Win2003 такое возможно?

То есть на данный момент дела обстоят так: батник запускается, отрабатывает и окошко закрывается. Делаю в конце выполнения батника timeout /t 28000 чтобы окошко еще 8 часов не закрывалось, читаю как отработали команды и закрываю его вручную. А как сделать нечто вроде лога?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

Предыдущая тема: Сброс пароля администратора


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