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

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

Автор: GORA2
Дата сообщения: 01.06.2011 15:05

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

wolf0425, дискуссия у нас какая-то беспредметная, Вы не находите?
Разница в размерах на два порядка, а насчет эрзаца, Вы это зря. Задачи у всех разные, зачем мне танк для поездки к соседу на соседнюю улицу? Я и на велосипеде не опоздаю...
Автор: ASE_DAG
Дата сообщения: 01.06.2011 16:21
01MDM
>> поскольку без кода возврата скрипт завершиться не может
> если я не укажу код возврата то батник не завершится?
поскольку без кода возврата скрипт завершиться не может, не указывая его, вы фактически указываете ноль, т.е. «все ОК» — а это очевидная дезинформация
Автор: 01MDM
Дата сообщения: 01.06.2011 17:09
ASE_DAG

Цитата:
а это очевидная дезинформация

Батник завершил работу? Что и требовалось в случае ложного пути. Если кому надо рассматривать коды возврата, допустим для дальнейшего анализа и действий, пусть об этом скажет. Я считаю это не принципиальным. В данном случае достаточно goto:eof. Кроме того я не убрал stderr, если запускать батник из консоли, то ошибка pushd будет видна.


Добавлено:
wolf0425

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

Как это?

Код:
> md "folder 3"

> for %i in ("folder 3") do @echo %~snxi
FOLDER~1

> rd "folder 3"

> md folder.1.2.3

> for %i in ("folder.1.2.3") do @echo %~snxi
FOLDER~1.3

> ren folder.1.2.3 "folder 3"

> for %i in ("folder 3") do @echo %~snxi
FOLDER~1

>
Автор: fire4x
Дата сообщения: 01.06.2011 17:33
king_stiven, спасибо. 2-ой вариант - то что доктор прописал...

P.S. Выражаю благодарность всем кто пытался помочь.
Автор: wolf0425
Дата сообщения: 01.06.2011 18:42

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


Автор: 01MDM
Дата сообщения: 01.06.2011 19:05
wolf0425

Цитата:
ты тот код что я приводил запусти и посмотри

Ты же там сначала пытаешься определить переменные, а только потом создаешь папку. Я сразу написал:

Цитата:
Папки в exclude-списке должны существовать

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

Код:
for %%i in ( short~1 short~2 short~3 ) do set "exclude_%%i=1"
Автор: A1eksandr1
Дата сообщения: 01.06.2011 19:46
Добрый вечер. Подскажите:
Нужно в одном бантике дважды прочитать введённое число в переменную.

Первый раз читаю так:
set /p ERRORLEVEL=Введите число и нажмите клавишу ENTER:

Второй раз при использовании этой же команды новое число не сохраняется, остаётся старое. Как можно это разрешить?
Автор: 01MDM
Дата сообщения: 01.06.2011 20:03
A1eksandr1

Цитата:
Второй раз при использовании этой же команды новое число не сохраняется, остаётся старое

Приведи пример.

Автор: A1eksandr1
Дата сообщения: 01.06.2011 20:11
01MDM

Код:
set /p ERRORLEVEL=Введите номер операции и нажмите клавишу ENTER:
@ECHO Выполняю операцию № %ERRORLEVEL%! Ожидайте...
@IF "%ERRORLEVEL%"=="1" блаблабла
@IF "%ERRORLEVEL%"=="2" (
set /p ERRORLEVEL=Введите требуемое значение и нажмите клавишу ENTER:
@ECHO Выполняю расчёт со значением %ERRORLEVEL%!
блаблабла
)
Автор: NIKZZZZ
Дата сообщения: 01.06.2011 20:20
A1eksandr1

%ERRORLEVEL% - системная переменная, ей бесполезно присваивать значения ! Переименуй, например на %_ERRORLEVEL%
Автор: wolf0425
Дата сообщения: 01.06.2011 20:20
A1eksandr1 всё там сохраняется - это ты печатаешь неправильно.

set /p ERRORLEVEL=Введите номер операции и нажмите клавишу ENTER:
@ECHO Выполняю операцию № %ERRORLEVEL%! Ожидайте...
@IF "%ERRORLEVEL%"=="1" блаблабла
@IF "%ERRORLEVEL%"=="2" (
set /p ERRORLEVEL=Введите требуемое значение и нажмите клавишу ENTER:
@ECHO старое значение %ERRORLEVEL%
блаблабла
)
@ECHO новое значение %ERRORLEVEL%

вдумчиво читай хэлп на тему () и %переменных%


Добавлено:

Цитата:
%ERRORLEVEL% - системная переменная, ей бесполезно присваивать значения
почему это бесполезно? исправно присваивается ;)
а что после присваивания значение системной "переменной" недоступно - так наверно оно юзеру и не нужно.
Автор: A1eksandr1
Дата сообщения: 01.06.2011 20:25
NIKZZZZ
wolf0425
Хм, действительно вроде переназначилась без переименования, сейчас попробую в основной код вставить
Автор: NIKZZZZ
Дата сообщения: 01.06.2011 20:31
wolf0425

Цитата:
так наверно оно юзеру и не нужно.



Цитата:
@IF "%ERRORLEVEL%"=="1" блаблабла
@IF "%ERRORLEVEL%"=="2"


Судя по коду , нужно, если , конечно не анализируется результат блаблабла
Автор: wolf0425
Дата сообщения: 01.06.2011 20:37
ASE_DAG
Цитата:
поскольку без кода возврата скрипт завершиться не может, не указывая его, вы фактически указываете ноль, т.е. «все ОК» — а это очевидная дезинформация
вообще-то при отсутствии каталога указанный код производит выход из батника с кодом 1, а вовсе не с кодом ноль.
А при том что возвращаемый батником код заказчику хоть как-то интересен только если он вообще знает что это такое - иначе как очевидно безграмотным умничаньем я такое замечание расценивать не могу

Добавлено:

Цитата:
Судя по коду , нужно, если , конечно не анализируется результат блаблабла
я бы не поручился, что анализировать юзер хочет результат блаблабла при вводе 1, а не результат собственного ввода отличного от 1.
Кому нужен возвращаемый код ошибки - так переменные не обзывают, да
в любом случае, после принудительного присваивания %ERRORLEVEL% - ожидать увидеть там код ошибки - слишком самонадеянно.
Автор: A1eksandr1
Дата сообщения: 01.06.2011 20:48
wolf0425
Спасибо за помощь, чтобы разговор был предметным, внесу ясность, выложив бантик (собираю для консультанта все необходимые операции в одну кучу)
Интересно то, что сейчас разнёс на большое расстояние эти 2 ввода и переменная сново перестала переназначаться.
http://rghost.ru/8962691/private/8c6ba4ed5a4738cee68ac12b06cb98bd
После запуска бантика введите 20, там будет 2ой ввод числа, который у меня не работает
Автор: wolf0425
Дата сообщения: 01.06.2011 20:52

Цитата:
Интересно то, что сейчас разнёс на большое расстояние эти 2 ввода и переменная сново перестала переназначаться.
никуда ты не разнес - как в примере выше там опять присваивание и печать внутри одних ()
при обработке скобок - сначала все %переменные% в скобках заменяются своими значениями а только потом происходит выполнение каких-то команд в скобках.
соответственно - присваивается там нормально, а вот печатается конечно же 20...
и будь ласка, переименуй переменную например в %_ERRORLEVEL% или как-то ещё - имя действительно зарезервировано и не нужно привыкать его использовать.

И, кстати, вписывать @ в начало каждой строки после @echo off - как бы незачем...
Автор: A1eksandr1
Дата сообщения: 01.06.2011 20:56
wolf0425
Суть в том, что если я подрят делаю два ввода (просто для проверки), то оно работает:
set /p ERRORLEVEL=Введите номер варианта запуска и нажмите клавишу ENTER:

Код: @ECHO Выполняю операцию № %ERRORLEVEL%! Ожидайте...
set /p ERRORLEVEL=Введите номер варианта запуска и нажмите клавишу ENTER:
@ECHO Выполняю операцию № %ERRORLEVEL%! Ожидайте...
Автор: wolf0425
Дата сообщения: 01.06.2011 20:58

Цитата:
А в выложенном мной бантике, где второй ввод идёт ниже, в переменной остаётся старое число, введённое раньше
неверно - в переменной там новое число, а печатается после её ввода - старое, так и должно происходить внутри скобок ()
Автор: A1eksandr1
Дата сообщения: 01.06.2011 21:01
Если присваивается нормально, а просто ECHO выводит старое значение, меня это устраивает.
Если я далее в этом ифе продолжу работу с %ERRORLEVEL% в др командах (DEL и COPY например), не будет ли он тоже старым. Впрочем на практике сейчас и увижу
Автор: wolf0425
Дата сообщения: 01.06.2011 21:03

Цитата:
Если я далее в этом ифе продолжу работу с %ERRORLEVEL% в др командах (DEL и COPY например), не будет ли он тоже старым.
конечно же будет - ВСЕ места использования %ERRORLEVEL% внутри скобок - заменяются на значение %ERRORLEVEL% ДО выполнения первой команды в скобках, ты вообще читал что я тебе выше написал?

или избавляйся от скобок или ставь в начало батника setlocal enabledelayedexpansion и переходи с %переменных% на !переменные!


Автор: A1eksandr1
Дата сообщения: 01.06.2011 21:12
wolf0425
Благодарю, разобрался, наверное сплю уже.
Привык к Си, Фортрану, там никогда такой логики не встречал
Автор: GORA2
Дата сообщения: 01.06.2011 21:23
bomzzz дополнил утилиту, для закачивания файлов, новыми возможностями. Теперь она может получать размер файла, дату/время и много другой информации при размере утилиты 4 КБ.
Желающие могут потестировать.
Подробности в README внутри архива. Скачать.
Автор: HA3APET
Дата сообщения: 01.06.2011 23:23
GORA2
Здорово, я как раз искал автора этой утилиты. Умеет ли она обновлять файл если по удалённому адресу он новее? Есть ли индикатор скачивания?
Если можно опишите на примере.
Автор: 5peciali5t
Дата сообщения: 02.06.2011 01:43
HA3APET
отвечу за автора
индикатора скачивания нет, а со сравнением файлов вероятно придется поплясать
делая запрос даты с N=11 с последующим преобразованием отданного (напр. "Thu, 26 May 2011 19:03:39 GMT") до чистой даты и локального запроса средствами например wmic c тем же форматом даты и последующим сравнением кто свежее...

прога отличная компактная но под конечные нужды придется повертеть напильником
Автор: res2001
Дата сообщения: 02.06.2011 09:29
All
Что-то я торможу. Надо в процедуру передать в параметре строку, параметр должен быть один, в строке возможны кавычки. Нифига не выходит.
Код такой:

Код: @echo off
call:proc "тут должна быть "фраза в кавычках" вот"
goto:eof

:proc
echo %~1
exit /b
Автор: wolf0425
Дата сообщения: 02.06.2011 09:46

Цитата:
Надо в процедуру передать в параметре строку, параметр должен быть один, в строке возможны кавычки.
передавать через переменную, а не в параметре - почему-то неприемлемо?

а через параметр передавать не-имя - наверно только так:


Код: @echo off
chcp 1251

call:proc "тут должна быть "фраза в кавычках" вот"
goto:eof

:proc
echo %*

exit /b
Автор: res2001
Дата сообщения: 02.06.2011 09:57
wolf0425
%* не вариант - в реальной процедуре еще параметры есть.
В переменной приемлемо, уже лабаю с переменной
спс.
Автор: smirnvlad
Дата сообщения: 02.06.2011 09:58
res2001

Цитата:
Надо в процедуру передать в параметре строку, параметр должен быть один, в строке возможны кавычки.

удвоить кавычки, затем удалить лишние

Код:
@echo off
set "par1=тут должна быть "фраза в кавычках" вот"
call :proc "первый" "%par1:"=""%"

call :proc "второй" "тут должна быть ""фраза в кавычках"" вот"

goto:eof

:proc
echo %~1
set "fp=%~2"
set "fp=%fp:""="%"
echo %fp%

exit /b
Автор: res2001
Дата сообщения: 02.06.2011 10:06
smirnvlad

Цитата:
удвоить кавычки, затем удалить лишние

То же можно, но с переменной короче.


Добавлено:
Подумал еще, что можно заменить двойные кавычки на одинарные, строка нормально передается. Меня в принципе устроит, но все равно потребуется промежуточная переменная, а тут уже можно и не заменять.
В общем остановился на варианте передачи через переменную.
wolf0425, smirnvlad - спасибо!
ЗЫ: Почему то зациклился на экранировании, другие варианты не рассматривал. Решил привлечь коллективный разум
Видимо в этой ситуации экранировать не получится.
Автор: GORA2
Дата сообщения: 02.06.2011 14:30

Цитата:
Умеет ли она обновлять файл если по удалённому адресу он новее?

Последняя версия умеет.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071

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


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