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

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

Автор: 01MDM
Дата сообщения: 30.01.2008 14:29
OOD
Нужно просканировать весь диск или только корень? Вариант если искать start.bat в корне каждого раздела.

Код:
@echo off
for %%i in (q w e r t y u i o p a s d f g h j k l z x c v b n m) do (
if exist %%i:\start.bat (
pushd %%i:\
start cmd /c start.bat
popd
)
)
Автор: OOD
Дата сообщения: 30.01.2008 14:49
01MDM
О спасиво великий гуру , как вы мне помогли!!!!!!
Автор: PuzzleW
Дата сообщения: 30.01.2008 16:44
Grim_Repo
Батником ты этого не сделаешь.
Как вариант - возьми эталонный ярлык со ссылкой на c:\program files\
измени его так чтобы стартовый каталог был D:\pr0gram\filez\ как тебе надо
а потом найди это .lnk файл и копируй вместо того что у тебя есть.
Автор: LDAP
Дата сообщения: 30.01.2008 17:35
king_stiven
А-а, теперь понятно.
А вот если мне нужно копирование нескольких типов файлов с разных папок, то нужно на каждый тип в этот батник писать новую такую же конструкцию. Или можно как-то это организовать в одной?
Автор: LDAP
Дата сообщения: 31.01.2008 10:01
Попробовал задать несколько условий в FOR одновременно, в таком случаи файлы копируются, впринципе. Но в случаи "внештатной ситуации" сообщения не выдаются. Так что, похоже что нужно для каждого типа писать свой цикл, чтобы все цывильно, с выдачей ошибок.
И последний вопрос. Если я задам во всех циклах одну и ту же переменную, она в каждом новом цикле будет заново менять значение, или лучше для каждого цикла задать свою переменную?
Автор: 01MDM
Дата сообщения: 31.01.2008 11:24
LDAP
Проверь, будет работать?

Код:
for %%i in (cnt jpg pdf mp3) do (
for %%x in ("E:\TEMP_RA\IRBIS\DATAI\IBIS\*.%%i") do (
xcopy "%%x" C:\test\WebIRBIS3.3\irbis\ibis\ /Y /R /H
if ERRORLEVEL 1 (
Комманда копирования файла "%%x1" вернула код ошибки!!! >> log.txt
) else (
Echo Файл "%%x" скопирован успешно >>log.txt
)
set proverka=yes
)
if not defined proverka Echo Скрипт копирования вернул код ошибки "Файлы для копирования не найдены" >> log.txt
set proverka=
)
Автор: king_stiven
Дата сообщения: 31.01.2008 12:40
LDAP

Цитата:
Если я задам во всех циклах одну и ту же переменную, она в каждом новом цикле будет заново менять значение, или лучше для каждого цикла задать свою переменную?

вопроса не понял, с примерами задай
Автор: Serhi84
Дата сообщения: 31.01.2008 13:58
Народ, здравствуйте.

Задача, в процессе которой возникли проблемы с её решением - есть папка, содержащая файлы и подпапки с файлами. Необходимо выявить файлы, дата модификации которых не больше определенной даты. В качестве параметров передавать:
1) имя каталога с файлами, в котором нужно производить поиск
2) признак поиска в подпапках(например 1 - просматривать файлы в подпапках, 0 - анализировать только файлы в корне исходной папки, не учитывая подпапок)
3) количество дней (не больше 31), которое вычитается из текущей даты. Полученная дата сравнивается с датой создания/модификации файлов в папке. Если существуют файлы старее
полученной даты - высылается уведомление на email.
4). маска для поиска файлов (например *.txt - анализируем на старость только текстовые файлы).

передать параметры при запуске программы не составит труда. Отправку на email сделал vbs-кой и буду вызывать её из bat`ника. Вычитание из текущей даты количества дней тоже в принципе представляю как делать (немножко изменить код в вышеперечисленных сообщениях где получали текущую дату -1 день).

НО!!!!!

Когда получаю дату создания/модификации файла - результат выходит вместе со временем

For %%i In (c:\scr\*) Do SET create=%%~ti
ECHO %create%

То есть мне нужно из возвращаемого значения как то выделить только дату, чтобы я мог сравнить это значение с другой датой. Вот в этом и загвоздка. Без времени данную строку не получить, функций для возврата части строки тоже нет. Не представляю как это сделать.

И еще вопрос - как сравнить 2 даты? Что-то типа
IF "30.01.2009" > "30.01.2008"
не срабатывает.

Хотел писать все на vbscript, но не знаю как там внутри скрипта описать параметры для запуска....

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

Добавлено:
Такс...с первой частью разобрался. Сначала вывожу дату/время модификации файлов в текстовый файл , а потом считываю его построчно

CD c:\scr\
for /F "tokens=1* delims= " %%i in (dates.txt) do @echo %%i

Остается маленький вопрос - как сравнить 2 даты?

И еще - можно ли результат выполнения команды For %%i In (c:\scr\*) Do ECHO %%~ti писать не в текстовый файл и из него считывать, а сразу передавать данные на вход команды for /F "tokens=1* delims= " %%i in (??? что тогда будет здесь ???) do @echo %%i
Автор: king_stiven
Дата сообщения: 31.01.2008 15:36
Serhi84
А можно и не выводить в текстовый файл, посмотри ( а лучше скачай) все страницы этого топика, примеры были
как сравнить 2 даты тоже не так уж и давно что то такое я выкладывал.
For %%i In (c:\scr\*) Do (
for /F "tokens=1* delims= " %%j in ("%%~ti") do @echo %%j
)
Автор: Mamontoza
Дата сообщения: 01.02.2008 10:03
Может я немпножко не потеме есть БАТНИК который при звершения процесса пишет лог в батнике импользуеться psexec, как сделать так чтоб в логе не выводилась инфа PSEXECa ???
PsExec v1.82 - Execute processes remotely
Copyright (C) 2001-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

Процесс не найден: program.exe
Connecting to User-01...


Starting PsExec service on User-01...


Connecting with PsExec service on User-01...


Starting tskill on User-01...
Автор: Grim_Repo
Дата сообщения: 01.02.2008 12:11
Здравствуйте, требуется батник который добавляет .reg файлы в реестр, у меня получился такой:
Код: regedit /s abc.reg
regedit /s def.reg
regedit /s ghi.reg
Автор: LDAP
Дата сообщения: 01.02.2008 13:35
Допустим:

Код:
for %%a in ("E:\Irbis\IRBIS\DATAI\DNEPR\*.cnt") do (
xcopy "%%a" C:\DBase\WebIRBIS3.3\DNEPR\ /Y /R /H
if ERRORLEVEL 1 (
Комманда копирования файла "%%a" вернула код ошибки!!! >> log.txt
) else (
Echo Файл "%%a" скопирован успешно >>log.txt
)
set proverka=yes
)
if not defined proverka Echo Скрипт копирования вернул код ошибки "Файлы для копирования не найдены" >> log.txt
set proverka=
rem
rem
rem
for %%a in ("E:\Irbis\IRBIS\DATAI\INLIT\*.cnt") do (
xcopy "%%b" C:\DBase\WebIRBIS3.3\INLIT\ /Y /R /H
if ERRORLEVEL 1 (
Комманда копирования файла "%%a" вернула код ошибки!!! >> log.txt
) else (
Echo Файл "%%a" скопирован успешно >>log.txt
)
set proverka=yes
)
if not defined proverka Echo Скрипт копирования вернул код ошибки "Файлы для копирования не найдены" >> log.txt
set proverka=
Автор: 01MDM
Дата сообщения: 01.02.2008 14:10
LDAP

Цитата:
чтобы она сохранила свое значение после выхода из for

Создай новую переменную set NewVar=%%a

Автор: cluster
Дата сообщения: 01.02.2008 18:47
Ребята, а subinacl'ом можно снять галку "Наследовать разрешения от родительских объектов"?
Автор: LDAP
Дата сообщения: 02.02.2008 11:39
И опять вопросы. Блин то ли я тупой, то ли пока не читал хорошего описания по батникам.
Переменные:
1.Как правильно отображаются переменные в батниках? Т.е. я в описаниях и в примерах видел много разных способов отображения переменной. В описании написано только то, что если скрипт будет запущен с консоли, то переменную вызывать как %а%, если скрипт будет запущен из батника, то переменную вызывать так:%%а%%. Правильно ли это?
2.В примерах много раз встречал вызов так %%а. При каких условиях нужно так ее вызывать?
3.Если имя переменной состоит не с одного символа, как ее вызывать? Т.е. если она объявлена так set var=1, то как ее вызывать?
Подстановки:
Допустим мне нужно скопировать файл, но при этом в конечном файле, после имени, перед расширением должна стоять единица.

Код:
for %%i in (cnt ifp l01 l02 n01 n02 mst xrf) do (
for %%x in ("E:\TEMP_RA\IRBIS\DATAI\IBIS\*.%%i") do (
set a=1
set y=%%~Nx
set z=%%~Xx
set Newfname=%y%%a%%z%
xcopy "%%x" C:\test\WebIRBIS3.3\irbis\ibis1\%Newfname% /Y /R /H
if ERRORLEVEL 1 (
Комманда копирования файла "%%x" вернула код ошибки!!! >> log.txt
) else (
Echo Файл "%%x" скопирован успешно >>log.txt
ren
)
set proverka=yes
)
if not defined proverka Echo Программа вернула код ошибки: "Файлы для копирования не найдены" >> log.txt
set proverka=
)
Автор: king_stiven
Дата сообщения: 02.02.2008 11:58
LDAP
1 В описании написано только то, что если скрипт будет запущен с консоли, то переменную вызывать как %а, если скрипт будет запущен из батника, то переменную вызывать так:%%а

3 set var=1 , так мы задаём глобальную переменную var
echo %var%, вызов переменной var


Код: for %%c in (cnt ifp l01 l02 n01 n02 mst xrf) do (
for %%d in ("E:\TEMP_RA\IRBIS\DATAI\IBIS\*.%%c") do (
xcopy "%%d" "C:\test\WebIRBIS3.3\irbis\ibis1\" /Y /R /H
if ERRORLEVEL 1 (
Комманда копирования файла "%%d" вернула код ошибки!!! >> log.txt
) else (
Echo Файл "%%d" скопирован успешно >>log.txt
)
ren "C:\test\WebIRBIS3.3\irbis\ibis1\%%~nxd" "%%~nd1%%~xd"
set proverka=yes
)
if not defined proverka Echo Программа вернула код ошибки: "Файлы для копирования не найдены" >> log.txt
set proverka=
)
Автор: 01MDM
Дата сообщения: 02.02.2008 14:47
LDAP
У тебя не получается, потому что ты применяешь переменные в одном цикле несколько раз, не включив расширение переменной среды. Вот так будет правильней. Исправил не проверяя, могу где-то и ошибаться.

Код:
@echo off
setlocal enabledelayedexpansion
for %%i in (cnt ifp l01 l02 n01 n02 mst xrf) do (
for %%x in ("E:\TEMP_RA\IRBIS\DATAI\IBIS\*.%%i") do (
set Newfname=%%~nx1%%~xx
xcopy "%%x" "C:\test\WebIRBIS3.3\irbis\ibis1\!Newfname!" /Y /R /H
if ERRORLEVEL 1 (
echo Комманда копирования файла "%%x" вернула код ошибки!!! >> log.txt
) else (
Echo Файл "%%x" скопирован успешно >>log.txt
ren
)
set proverka=yes
)
if not defined proverka Echo Программа вернула код ошибки: "Файлы для копирования не найдены" >> log.txt
set proverka=
)
Автор: LDAP
Дата сообщения: 02.02.2008 16:24
king_stiven
При вашей доработке в конечной папке он не перейменовует файлы. Т.е. не добавляет в название единицу.

01MDM
Скрипт работает так как нужно, кроме того, что он, перед каждым копированием спрашивает:
C:\test\WebIRBIS3.3\irbis\ibis1\!Newfname! это имя файла или папки?
Но вот я не пойму чего он спрашивает, ведь если есть расширение, то понятно что это имя файла?
А послендий вариант я пробовал, у меня он не работал. Скрипт спрашивает это файл или папка(всего раз спрашивает), а потом в конечной папке создает один файл с названием %~nX%~xX и все. Тут, видимо дело в подстановке переменной, синтаксис не тот, и CMD не понимает что ему дают переменную для подстановки, думает что это просто имя. Потому я и спрашивал за правильно написание переменных в разных случаях.
Автор: 01MDM
Дата сообщения: 02.02.2008 17:55
LDAP

Цитата:
Тут, видимо дело в подстановке переменной

Нет, это фича xcopy
Из справочника:

Цитата:

/i
Если источником является каталог или источник содержит подстановочные знаки и результат не существует, команда xcopy считает, что результат — это имя каталога, и создает новый каталог. Затем xcopy копирует все указанные файлы в новый каталог. По умолчанию команда xcopy запрашивает подтверждение, является ли параметр результат каталогом или файлом.

А почему xcopy? В твоем случае copy - лучше не придумаешь.

Код:
@echo off
md test-1 2>nul
for %%i in (test\*) do copy "%%i" "test-1\%%~ni-1%%~xi"
Автор: king_stiven
Дата сообщения: 02.02.2008 18:17
LDAP
Поправил
01MDM
Я ему предлагал copy , наверно принципы не позволяют.
Автор: VladimirSavitsky
Дата сообщения: 03.02.2008 12:42
Подскажите.
Есть Bat файл:

regedit.exe -s ProgReg.reg
Prog.exe
regedit.exe -s ProgUnReg.reg

Хотелось бы спрятать черное окно при обработке командного файла.
Заранее спасибо.
Автор: NikTychina
Дата сообщения: 03.02.2008 13:11
Подскажите, пжл, как можно посмотреть время работы системы (XP Prof sp2)?
Автор: 01MDM
Дата сообщения: 03.02.2008 13:28
NikTychina
systeminfo | findstr "Время работы"


Добавлено:
VladimirSavitsky
Много раз обсуждалось, можно воспользоваться утилитами из "шапки" топика.
Автор: Elroir
Дата сообщения: 03.02.2008 18:51
Grim_Repo

Цитата:
успешное выключение компьютера тоже нужно записывать в лог

Как ты себе это представляешь? Батник на выключенном компьютере записывает что-то в лог?
Автор: Grim_Repo
Дата сообщения: 04.02.2008 00:19
2Elroir

Цитата:
Как ты себе это представляешь? Батник на выключенном компьютере записывает что-то в лог?

Я имел в виду записывть в лог успешное исполнение команды shutdown /s t 0
Автор: Elroir
Дата сообщения: 04.02.2008 00:56
Grim_Repo
Все равно не понимаю - при исполнении этой команды, начнется процесс выключения системы, то есть остановка всех процессов, закрытие всех программ и окон. Успешное завершение команды shutdown - полное выключение компа. И как в таком случае записывать лог?
Автор: king_stiven
Дата сообщения: 04.02.2008 10:03
Elroir

shutdown /s t 0
if errorlevel 1 здесь записать неудачу выключения в лог и вывести её на экран
автор может сам написать, я думаю.
Автор: 01MDM
Дата сообщения: 04.02.2008 10:54
king_stiven

Цитата:
shutdown /s t 0

Здесь неудача будет всегда . Наверное можно при следующей загрузке отследить событие выключения \ остановки соответствующих служб и внести информацию в лог. У меня eventquery не работает (ОШИБКА: Не удается включить общий модуль "CmdLib.Wsc".), наверное не все скопировал с XP Pro. Поэтому проверить не могу.
Автор: Wise_Kaa
Дата сообщения: 04.02.2008 15:48
Доброго дня. Подскажите, добрые люди.
Есть следующая код:

Цитата:

for %%F in (*.*) do (
find "%%F" report.txt
if NOT %errorlevel%==0 echo %%F
)


Перебираем все файлы в папке, и ищем встречается ли имя файла в файле report.txt, если не встречается, то выводим имя файла.
Проблема в том, что errorlevel, с помощью которого я планировал узнавать в теле for всегда равен 0, независимо от того, нашел он имя файла в report.txt или нет. Как решить проблему, может кто подскажет вариант попроще? Вызывать еще один батник и передавать ему в каячестве параметра имя файла?
Автор: 01MDM
Дата сообщения: 04.02.2008 16:15
Wise_Kaa
Вот так должно работать

Код:
for %%f in (*.*) do (find "%%f" report.txt 1>nul || echo %%f)

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869

Предыдущая тема: Доступ к реестру через RegEdit?


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