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

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

Автор: 01MDM
Дата сообщения: 31.05.2011 20:05
ASE_DAG
Тут вопрос в том откуда батник будет вызываться. Если не указывать %~dp0, то есть вероятность, что батник отработает не там где он лежит, а в текущей директории в консоли. Это все равно, что положить батник на рабочий стол, и запустить его находясь в system32, например по удалению всех *.dll =)
Автор: ASE_DAG
Дата сообщения: 31.05.2011 20:12
01MDM
Что значит «есть вероятность»? Батник и должен отработать в для какой-то определенной директории, например, для текущей.
Использовать путь до батника в качестве параметра в данном случае (да и в большинстве) — извращение. ;-)

Добавлено:
fire4x
Вы итоговую задачу-то объясните, будет понятно, как к ней подступаться.
Автор: 01MDM
Дата сообщения: 31.05.2011 20:31
ASE_DAG

Цитата:
Использовать путь до батника в качестве параметра в данном случае (да и в большинстве) — извращение.


Это вопрос спорный. Все только в конкретном контексте, но лучше перестраховаться и если батник должен отработать там где он лежит, то для этого пригодится %~dp0 или переходить в нужную директорию вручную.

Добавлено:
Т.е. все сводится к тому класть батник в рабочую папку или положить его в %path%.
Автор: ASE_DAG
Дата сообщения: 31.05.2011 20:38
01MDM
> Все только в конкретном контексте
Которого мы не знаем. Согласен.
Автор: fire4x
Дата сообщения: 31.05.2011 20:57
ASE_DAG

Цитата:
Добавлено:
fire4x
Вы итоговую задачу-то объясните, будет понятно, как к ней подступаться.



Цитата:
P.S. Попробую сформулировать задачу как можно проще:

* Нужно поместить в папку WINDOWS батник, который залезет например в system32, а от-туда например в oobe и удалит из нее все папки кроме нескольких (имена которых будут перечисленны в самом батнике).

* Папка WINDOWS дана исключительно в качестве примера. Вместо нее будет абсолютно любая папка.



Автор: 01MDM
Дата сообщения: 31.05.2011 21:38
fire4x

Код:
@echo off
setlocal

pushd "c:\windows\system32\oobe" || goto:eof

for %%i in ( folder1 folder2 "folder 3" ) do set "exclude_%%~snxi=1"

for /f "tokens=*" %%i in (' dir /b /ad ') do if not defined exclude_%%~snxi rd /s /q "%%i"

popd
Автор: ASE_DAG
Дата сообщения: 31.05.2011 21:56
fire4x

Цитата:
Вы итоговую задачу-то объясните, будет понятно, как к ней подступаться.

Итоговая — она же изначальная. :D То, что вы приводите — не она.

01MDM
> pushd "c:\windows\system32\oobe" || goto:eof
Эээ... Это зачем? Мы же так с нулевым кодом возврата выйдем, не?

pushd "c:\windows\system32\oobe" || exit /B 1
Автор: HA3APET
Дата сообщения: 31.05.2011 22:14

Код: wget.exe -N http://download.skype.com/ab/SkypeSetupFull.exe
SkypeSetupFull.exe /EXTRACTONLY
Автор: ASE_DAG
Дата сообщения: 31.05.2011 22:41
HA3APET
> wget.exe с ключом "-c" докачивает или обновляет файл если по удалённому адресу версия новее.
ОМГ! Откуда у вас такие сведения? Ключ не предписывает ничего сравнивать. Если файл изменился и стал больше, будет загружено только недостающее до нового размера количество байт, начиная с конца старого файла. В общем, явно не то, что требуется. :-)
Для сравнения по дате модификации следует указать ключ -N.
Автор: HA3APET
Дата сообщения: 31.05.2011 22:55
ASE_DAG
да да, исправил -с на -N
Автор: 01MDM
Дата сообщения: 31.05.2011 23:04
ASE_DAG

Цитата:
Мы же так с нулевым кодом возврата выйдем, не?

Какая разница? От кода возврата в данном случае ничего не зависит, главное что бы батник не выполнился в другой директории.
Автор: ASE_DAG
Дата сообщения: 31.05.2011 23:06
HA3APET
> исправил -с на -N
Ну, тогда не докачивает. ;-) Почему бы не использовать их оба: wget -cN бла-бла-бла Не, фигню сказал.

Ну а методы решения вашего вопросы, я думаю, понятны:
1. Грепать отладочный вывод вэгета.
2. Сохранять дату модификации SkypeSetupFull.exe до вызова вэгета, и сравнивать с получившейся после.
Я бы выбрал второе — повторная проверка того же самого есть много меньшее зло чем грепание human-readable вывода.

Добавлено:
01MDM
Что значит «какая разница»? У вас скрипт не выполнился из-за ошибки, а вы ноль возвращаете!
Автор: 01MDM
Дата сообщения: 31.05.2011 23:22
ASE_DAG

Цитата:
У вас скрипт не выполнился из-за ошибки, а вы ноль возвращаете!

В общем то скрипт выполнился, завершился при условии, что путь неверен. Или надо обязательно втыкать в errorlevel? А если его вообще запустят мышью из проводника где вы будете разглядывать код возврата? Имхо это лишнее, а кому надо тот добавит и код возврата и лог и полосу прогресса и кучу echo со здрастями-досвиданьями.
Автор: HA3APET
Дата сообщения: 31.05.2011 23:36

Цитата:
Ну а методы решения вашего вопросы, я думаю, понятны:

Методы и мне понятны, но я не есть гуру кодинга.
Всё упирается в реализацию!

Автор: ASE_DAG
Дата сообщения: 31.05.2011 23:37
01MDM
> Или надо обязательно втыкать в errorlevel?
«Втыкать»? Если имелось в виду «обязательно ли указывать», то да, обязательно — поскольку без кода возврата скрипт завершиться не может, не указывая его, вы фактически указываете ноль, т.е. «все ОК» — а это очевидная дезинформация.
Автор: fire4x
Дата сообщения: 01.06.2011 01:13
01MDM

Цитата:
Код:
@echo off
setlocal

pushd "c:\windows\system32\oobe" || goto:eof

for %%i in ( folder1 folder2 "folder 3" ) do set "exclude_%%~snxi=1"

for /f "tokens=*" %%i in (' dir /b /ad ') do if not defined exclude_%%~snxi rd /s /q "%%i"

popd

c:\windows\system32\oobe - путь к начальной папке НЕИЗВЕСЕН !!!

ASE_DAG

Цитата:
Цитата:Вы итоговую задачу-то объясните, будет понятно, как к ней подступаться.

Итоговая — она же изначальная. То, что вы приводите — не она.



Попробую сформулировать задачу ещё проще:

* После извлечения батника в папку - в данном примере папку WINDOWS, он удалит все папки кроме нескольких (имена которых будут перечисленны в самом батнике) из папки oobe, которая находится в папке system32, которая собственно и расположена в папке WINDOWS.

* Папка WINDOWS дана исключительно в качестве примера. Вместо нее будет использована любая папка.

ИТОГОВАЯ ЗАДАЧА - удаление глубоко расположенных ненужных папок.

Автор: ASE_DAG
Дата сообщения: 01.06.2011 01:25
fire4x
> После извлечения батника в папку
Забудьте вы пока про батник.

> путь к начальной папке НЕИЗВЕСЕН !!!
И когда и при каких обстоятельствах он станет «извесен»?

> WINDOWS дана исключительно в качестве примера. Вместо нее будет использована любая папка.
Ну не «любая» же в значении «рандомная»? Она будет указана вами (пользователем)? Или кем-то еще?
Автор: 01MDM
Дата сообщения: 01.06.2011 05:24
ASE_DAG

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

Т.е. если я не укажу код возврата то батник не завершится? Что за бред?

Добавлено:
fire4x

Цитата:
путь к начальной папке НЕИЗВЕСЕН !!!

Ну так и подставь вместо c:\windows\system32 %~dp0

Код:
pushd "%~dp0oobe" || goto:eof
Автор: tolyn77
Дата сообщения: 01.06.2011 07:05
привет всем

подскажите как отфильтровать вывод из командной строки?
например
>server.bat

Обмен пакетами с 10.0.0.8 по 32 байт:

Ответ от 10.0.0.8: число байт=32 время<1мс TTL=128
Ответ от 10.0.0.8: число байт=32 время<1мс TTL=128

Статистика Ping для 10.0.0.8:
Пакетов: отправлено = 1, получено = 1, потеряно = 0 (0% потерь),
Приблизительное время приема-передачи в мс:
Минимальное = 0мсек, Максимальное = 0 мсек, Среднее = 0 мсек

нужно
Ответ от 10.0.0.8: число байт=32 время<1мс TTL=128
Ответ от 10.0.0.8: число байт=32 время<1мс TTL=128

заранее благодарен
Автор: wolf0425
Дата сообщения: 01.06.2011 07:21
tolyn77
server.bat | find "TTL="

ну или внутри server.bat аналогично дописать в строку с ping
Автор: Free_Soft
Дата сообщения: 01.06.2011 07:31
tolyn77
проще в запускаемом батнике дописать к команде ping:

Код: ping google.com | findstr /i "TTL="
Автор: wolf0425
Дата сообщения: 01.06.2011 07:36
01MDM
Цитата:
for %%i in ( folder1 folder2 "folder 3" ) do set "exclude_%%~snxi=1"
for /f "tokens=*" %%i in (' dir /b /ad ') do if not defined exclude_%%~snxi rd /s /q "%%i"
проверять надо бы по длинному имени, так как такая проверка по короткому не гарантирует срабатывание исключения на "folder 3" - например исключение не сработает если папка была создана с другим именем и переименована:


Код: @echo off

setlocal

rem pushd "c:\windows\system32\oobe" || goto:eof

for %%i in ( folder1 folder2 "folder 3" ) do set "exclude_%%~snxi=1"
md "folder.1.2.3"
ren "folder.1.2.3" "folder 3"


for /f "tokens=*" %%i in (' dir /b /ad ') do if not defined exclude_%%~snxi echo rd /s /q "%%i"

popd
Автор: Lutvun
Дата сообщения: 01.06.2011 07:57
res2001
Подходит! Спасибо.
Автор: king_stiven
Дата сообщения: 01.06.2011 09:31

Цитата:
В папке (например папка WINDOWS) лежит множество папок и файлов с произвольными именами.
В одной из тех папкок (например папка system32) - также множество папок и файлов с произвольными именами.
И вот эти папки (например подпапки в папке oobe) нужно удалить, но не все - а, например, кроме 2-х, названия которых известны (например папки images и sample).


Код: @echo off
chcp 1251>nul
set "f1=system32"
set "f2=oobe"
set "f3=images"
set "f4=sample"
for /r %%a in (.) do (
if defined not_first1 (
if "%%~na"=="%f1%" (
pushd "%%a"
if not errorlevel 1 for /r %%b in (.) do (
if defined not_first2 (
if "%%~nb"=="%f2%" (
pushd "%%b"
if not errorlevel 1 for /r %%c in (.) do (
if defined not_first3 (
if /i "%%~nc" neq "%f3%" if /i "%%~nc" neq "%f4%" rd /s /q "%%c"
) else (
set not_first3=1
)
)
)
) else (
set not_first2=1
)
)
)
) else (
set not_first1=1
)
)
Автор: res2001
Дата сообщения: 01.06.2011 10:01
fire4x

Цитата:
Не хочет запускаться...

Можешь запускать, в таком виде он ничего делать не будет, только выведет команды для удаления, проверишь, что все каталоги указаны правильно удалишь во второй строке echo, тогда заработает.


Цитата:
P.S. Если нужно указать конкретные каталоги первого и второго уровня (которые в примере - system32 и oobe), то вместо чего их подставлять?

Изначально про каталоги первого уровня ты ничего не говорил.
В текущей варианте ищутся только каталоги второго уровня, но если надо не удалять и первого и второго уровня, то переделать достаточно просто.
Указывай вместо
#folder1
#folder2
количество не ограничено , каждый каталог в отдельной строке, начинай с символа # кавычки в длинных именах не нужны.
Автор: GORA2
Дата сообщения: 01.06.2011 11:52
Free_Soft

Цитата:
У кого есть возможность, потестируйте консольную утилиту для скачивания файлов из интернет по http и ftp ссылкам

А есть возможность к ней прикрутить ключи для получения размера и даты запрашиваемого файла?
Автор: Free_Soft
Дата сообщения: 01.06.2011 12:00
GORA2

Цитата:
А есть возможность к ней прикрутить

вообще ее автор не я был, а bomzzz. Напишите ему в личку, может, поможет
Автор: wolf0425
Дата сообщения: 01.06.2011 12:55

Цитата:
А есть возможность к ней прикрутить ключи для получения размера и даты запрашиваемого файла?
а смысл? чем тебя готовый wget не устраивает?
разве что время выдает в GMT
Автор: GORA2
Дата сообщения: 01.06.2011 13:20

Цитата:
чем тебя готовый wget не устраивает?

Размером.
Автор: wolf0425
Дата сообщения: 01.06.2011 14:41

Цитата:
Размером.
неужели экзешник в 400к - настолько напрягает размером, что имеет смысл заказывать эрзац?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

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


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