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

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

Автор: GCRaistlin
Дата сообщения: 10.09.2016 13:02
YuS_two
Едва ли переменных таких будет много, зато если в путях будет "&"...
Автор: YuS_two
Дата сообщения: 10.09.2016 13:56
GCRaistlin

Цитата:
зато если в путях будет "&"...

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

Код: echo "%path%"
Автор: GCRaistlin
Дата сообщения: 10.09.2016 14:13
YuS_two
Это только в том случае, если путь с "&" сам добавлен без кавычек
Автор: YuS_two
Дата сообщения: 10.09.2016 14:38
GCRaistlin

Цитата:
если путь с "&" сам добавлен без кавычек

Это кто же его так добавлять будет, с кавычками?
Ну тогда с защитой от этого и даже от других непредвиденных ситуаций, пакетник:

Код: @echo off
setlocal enabledelayedexpansion
echo !path!
pause
Автор: GCRaistlin
Дата сообщения: 10.09.2016 14:54
YuS_two
Не слишком ли сложные замены универсального и лаконичного

Код:
set path
Автор: YuS_two
Дата сообщения: 10.09.2016 15:03
GCRaistlin

Цитата:
Не слишком ли сложные замены

А чего тут сложного-то и длинного?

Код: cmd /v/c echo !path!
Автор: GCRaistlin
Дата сообщения: 10.09.2016 15:18
YuS_two

Цитата:
А чего тут сложного-то и длинного?

Ну хотя бы то, что для освежения в памяти этих ключей вам пришлось залезть в справку к cmd, не правда ли? Да и - длиннее, как ни крути. Как и вариант с "echo", кстати.
В таких "подручных" командах важна лаконичность. Я лично обычно не утруждаю себя даже тем, чтобы дописывать "path" до конца, - "set p" использую.
Автор: YuS_two
Дата сообщения: 10.09.2016 15:53
GCRaistlin

Цитата:
не правда ли?

Неправда, это команды, которыми часто приходится пользоваться... но и в справку заглядывать - это не зазорно ведь, даже наоборот, сам рекомендую всем, зачастую.
Но то, что длиннее - согласен. Так ведь и первоначальное echo %path%, во многих случаях, вполне достаточно, ибо в path такие специфичные вещи, как спецсимволы, не думаю, что осознанно кто-то будет добавлять, как и пути с кавычками...
Ну да ладно, главное, что есть разные способы и возможности, а безвыходных ситуаций почти нет...
Автор: GCRaistlin
Дата сообщения: 10.09.2016 17:14
YuS_two

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

Командой cmd-то да, а вот ключом /v к ней мне лично до сей поры ни разу не приходилось.

Цитата:
Так ведь и первоначальное echo %path%, во многих случаях, вполне достаточно

Так и оно длинее, чем "set p". Которого пока мне тоже было всегда достаточно.
Автор: YuS_two
Дата сообщения: 10.09.2016 18:32
GCRaistlin

Цитата:
а вот ключом /v к ней мне лично до сей поры ни разу не приходилось.

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

Код: setlocal enabledelayedexpansion
set x=111
echo x=%x%
endlocal&set y=%x%&cmd /v/c echo y=!y!^&echo "%x%" "!x!" "%y%" "!y!"
:: или так:
rem endlocal&set y=%x%&cmd /v/c "echo y=!y!&echo "%x%" "!x!" "%y%" "!y!""

echo "%x%" "!x!" "%y%" "!y!"
Автор: Linksach
Дата сообщения: 10.09.2016 18:52
YuS_two

Как точно называется программа- libiconv-1.9.2-1.exe или как пишете вы iconv.exe.У меня libiconv-1.9.2-1.exe скачался и файл libiconv-1.9.2-1.exe лежит рядом с батником а установилась эта программа на диск C в папку Program Files/GnuWin32 или я неправильно что-то сделал

Всё -я вроде бы разобрался-надо было вам объяснить проще-что из Program Files/GnuWin32/bin закинуть iconv.exe ,положив рядом с батником.Ну да ладно,сейчас батник -преобразует некоторые спецсимволы и создаёт дерево каталогов.Сижу,жду окончания процесса.Как закончится отпишусь о результате


YuS_two

Всё конвертировалось отлично и создались каталоги с папками и подпапками.Названия папок вроде соответствуют.
Вообщем всё работает и через cmd только выполнение немного дольше чем скрипт в Powershell
А почему так.Я просто вообще не знаком с Powershell и скрипт запускал впервые.Видимо и другие скрипты в Powershell работают намного быстрее чем через cmd
Время выполнения
Код: Start: 10.09.2016 18:54:55,65
Stop: 10.09.2016 19:15:54,60
Автор: YuS_two
Дата сообщения: 10.09.2016 19:24
Linksach

Цитата:
файл libiconv-1.9.2-1.exe лежит рядом с батником

Это установщик. Рядом с батником должны быть три файла: "iconv.exe", "libiconv2.dll" и "libintl3.dll" (там есть привязка к библиотекам)
вот тут их можно взять

Цитата:
установилась эта программа на диск C в папку Program Files/GnuWin32

А вот в "Program Files" лучше не устанавливать её. Надо выбирать не защищённый UAC каталог для установки, чтобы не было впоследствии проблем с доступом к этому каталогу...
Хотя бы так:
C:\GnuWin32
А потом в системную переменную path, добавить путь C:\GnuWin32\bin
Автор: deadmz1980
Дата сообщения: 10.09.2016 19:37
Здравствуйте.
Подскажите пожалуйста, как решить такую проблему, есть батник бэкапа 1с, на платформе 8.2 работал нормально, после перехода на 8.3, после запуска и выполнения бэкапа в процессах так и остается висеть процесс cmd и 1с, хотя файл бэкапа благополучно выгрузился и скопировался на шару. Висящий в процессах процесс 1с мешает созданию следующего бэкапа. Спасибо за помощь!

Вот код батника:

Код: echo off
Set folder=%DATE%
mkdir c:\Backup\"%folder%"
if exist c:\Backup\currentdate.txt del c:\Backup\currentdate.txt
echo %folder% >> c:\Backup\currentdate.txt
copy /B c:\Backup\1c83backup.log+c:\Backup\currentdate.txt c:\Backup\1c83backup.log
"C:\Program Files (x86)\1cv8\8.3.7.2027\bin\1cv8.exe" config /s*\* /n*** /p*** /DumpIB "c:\Backup\%folder%\1Cv83.dt" /Out"c:\Backup\1c83backup.log" -NoTruncate
"C:\Program Files (x86)\1cv8\8.3.7.2027\bin\1cv8.exe" config /s*\* /n*** /p*** /UpdateDBCfg /DisableStartUpMessages /Out"c:\Backup\1c83backup.log" -NoTruncate
"C:\Program Files (x86)\1cv8\8.3.7.2027\bin\1cv8.exe" config /s*\* /n*** /p*** /IBCheckAndRepair /DisableStartUpMessages /Out"c:\Backup\1c83backup.log" -NoTruncate
if not exist \\*.*.*.*\BackUP\%folder%\ mkdir \\*.*.*.*\BackUP\%folder%\
copy /b /y C:\Backup\%folder%\*.* \\*.*.*.*\BackUP\%folder%\
Автор: Jon_Dow
Дата сообщения: 10.09.2016 19:52
deadmz1980
ты уверен что тебе именно в батники надо? Очевидно что один из вызов 1С не завершен.
Но если ты настаиваешь то допиши после копирования:
Код: taskkill.exe /im 1cv8* /f
exit 0
Автор: deadmz1980
Дата сообщения: 10.09.2016 20:11
Jon_Dow

Цитата:
Это значит что у тебя 1С-кластер - то есть используется СУБД - и ты делаешь такими средствами бэкап?!

Это запасной бэкап, основной делается на postgres.
Автор: Jon_Dow
Дата сообщения: 10.09.2016 20:19
deadmz1980
запасной делай там же: по отдельному расписанию и, по необходимости, в другое место.
Автор: deadmz1980
Дата сообщения: 10.09.2016 20:23
Jon_Dow

Цитата:
запасной делай там же: по отдельному расписанию и, по необходимости, в другое место.

Тоже вариант, спасибо! Сейчас займусь.
Автор: Jon_Dow
Дата сообщения: 10.09.2016 20:31
И вообще делаешь такую [more=структуру планировщика копирования]
- обеденная копия (каждый день 14-00) - хранить 3 последних
- дневная копия (пн-пт 23-00) - хранить 6 последних
- недельная копия (сб 23-00) - хранить 6 последних
- месячная копия (последнее вс месяца 23-00) - хранить 13 последних
- годовая копия (первое вс января 23-00) - хранить 50 последних
И получишь более чем плотное покрытие резервных копий. По необходимости можно ежедневно более часто делать чем в обед, по тем же принципам...
И спишь спокойно, без колхоза и велосипеда новомодней конструкции[/more]
Автор: Linksach
Дата сообщения: 10.09.2016 20:53
YuS_two


Цитата:
А потом в системную переменную path, добавить путь C:\GnuWin32\bin


Благодарю!Добавил в системную переменную путь C:\GnuWin32\bin

Я понял-это чтобы в след раз батник искал iconv.exe и находил по указанному пути
Автор: GCRaistlin
Дата сообщения: 10.09.2016 23:28
YuS_two

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

Использовать %-раскрытие, когда нет уверенности, что выводимое значение не содержит спецсимволов, - дурной тон. Привыкнешь - и твоя жизнь не будет стоить ломаного цента ("Человек с бульвара Капуцинов").


Цитата:
передать значение локальной переменной наружу

А вот так:

Код:
set a=b
set b=c
setlocal enabledelayedexpansion
for /f "delims=" %%A in ("!%a%!") do (
endlocal
set d=%%A
)
echo %d%
Автор: Jon_Dow
Дата сообщения: 10.09.2016 23:41
GCRaistlin
тебе столь интересна тема присвоений?
Тогда тебе понравится примерПотому как писать:
Цитата:
set a=b
set b=c
моветон дурной тон неправильно. Именно поэтому ты можешь предположить наличие "&" в путях на обычной системе...
Даже в заведомо простых ситуациях надо писать только заведомо устойчивый код - читаемость ниже, время выполнения дольше, зато код выполняет то что должен, а не "как же это у меня получилось"...
Автор: GCRaistlin
Дата сообщения: 10.09.2016 23:49
Jon_Dow

Цитата:
Потому как писать ... неправильно

И что тут неправильного?

Цитата:
Тогда тебе понравится пример

Много букв, мало пояснений. К чему вообще это все?

Цитата:
Даже в заведомо простых ситуациях надо писать только заведомо устойчивый код

Ну. А я о чем?
Автор: Jon_Dow
Дата сообщения: 10.09.2016 23:53
GCRaistlin
Цитата:
Ну. А я о чем?
ты даже обычное присвоение пишешь неустойчиво.
Так что вперед - штудируй cmd /?, set /?, for /? (для начала).

Цитата:
Много букв, мало пояснений. К чему вообще это все?
это пример как должен выглядеть относительно устойчивый код. А пояснений там достаточно - чай не в начальной школе - отвыкай.

Автор: GCRaistlin
Дата сообщения: 10.09.2016 23:58
Jon_Dow

Цитата:
ты даже обычное присвоение пишешь неустойчиво

Ну, урони мое "неустойчивое" присвоение. Продемонстрируй примером.
Автор: YuS_two
Дата сообщения: 11.09.2016 14:26
GCRaistlin

Цитата:
Использовать %-раскрытие, когда нет уверенности, что выводимое значение не содержит спецсимволов, - дурной тон.

Мы ведь тут не на приёме у короля программистов, чтобы этикет соблюдать
И кстати, не на уроке в школе, чтобы поучения давать и выслушивать...
Если требуется получить значение конкретной переменной, то наверное, дурной тон предлагать на выбор кучу значений из разных переменных... для себя - пожалуйста, но для совета посмотреть значение конкретной переменной, раскрытие set p, вовсе не годится.


Цитата:
нельзя? Читаемость выше, а время выполнения - ниже.

Можно. Я разве говорил о невозможности других вариантов?
Но я сомневаюсь, что Ваша запись способна передать значение переменной не из цикла
Скорость, конечно, фактор важный, хотя разница в пару сотых секунд , преимуществ никаких не даёт. А вот читаемость кода - это то, что меньше всего волнует... важнее точность выполнения того, что задумывалось и наименьшая подверженность исключениям.

Ну, хорошо, допустим необходимо передать значение в переменную по конвееру - как бы Вы сделали это?
Автор: GCRaistlin
Дата сообщения: 11.09.2016 14:50
YuS_two

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

У вас их таки куча выдается по 'set p'?

Цитата:
для совета посмотреть значение конкретной переменной, раскрытие set p, вовсе не годится

"Вовсе не годится" определяется исключительно по результату. Заметьте, я не говорил про 'echo %path%' - "вовсе не годится", я лишь сказал - "лучше по-другому".

Цитата:
я сомневаюсь, что Ваша запись способна передать значение переменной не из цикла

Не понял? В моем примере наружу (за пределы включенного delayed expansion) передано значение переменной, которое невозможно в общем случае получить без delayed expansion, - переменной d присвоено значение переменной, чье имя (b) задано переменной a. И a, и b заданы вне цикла. Так при чем тут он?

Цитата:
Скорость, конечно, фактор важный, но вот читаемость кода - это то, что меньше всего волнует...

Ну да, ну да. Особенно когда разбираешь его через год после написания. Правишь "ошибку" ("И как я мог такую глупость написать?.."), потом через некоторое время возвращаешь все обратно ("Ах вот оно, блин, что...").

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

Предлагаю и вам привести пример исключения, для которого моя конструкция не годится.

Цитата:
необходимо передать значение в переменную по конвееру

Свой пример приведите, пож.
Автор: YuS_two
Дата сообщения: 11.09.2016 15:19
GCRaistlin

Цитата:
У вас их таки куча выдается по 'set p'?

Ещё разок: у меня именно, таки нет спецсимволов с кавычками в path

GCRaistlin

Цитата:
И a, и b заданы вне цикла. Так при чем тут он?

А при том, что значение в глобальную переменную передаётся изнутри цикла и никак иначе. А то, что значение переменным задано вне цикла, в данном случае, не имеет никакого решающего значения. Сама передача происходит внутри цикла - нет?


Цитата:
моя конструкция не годится.

Об этом я не говорил, так что примеров приводить не стану.


Цитата:
Свой пример приведите, пож.

Пож.:

Код: @echo off
echo.123 >test.txt
rem собственно передача:
type test.txt|set /p x=^& cmd /v/c echo x=!x!>>"tmp" ^^^& set y=!x! ^^^&echo y=!y!>>"tmp"
rem остальное - вспомогательный код для наглядности...
<tmp findstr /rc:"."
del tmp
del test.txt
pause
Автор: GCRaistlin
Дата сообщения: 11.09.2016 17:01
YuS_two

Цитата:
Ещё разок: у меня именно, таки нет спецсимволов с кавычками в path

Цитируете одно, а отвечаете на другое.

Цитата:
Сама передача происходит внутри цикла - нет?

Это накладывает какие-то ограничения? У вас передача происходит вообще в другой копии интерпретатора.

Цитата:
Об этом я не говорил, так что примеров приводить не стану.

Ну, вы же сказали про "наименьшую подверженность исключениям". Способ с FOR им не подвержен в принципе - в отличие от вашего, кстати, по крайней мере в том виде, в котором вы его представили - замените

Код: set x=111
Автор: YuS_two
Дата сообщения: 11.09.2016 17:29
GCRaistlin

Цитата:
Цитируете одно, а отвечаете на другое.

Отнюдь, это всё про то же:

Цитата:
Лучше

Код: set path
Автор: GCRaistlin
Дата сообщения: 11.09.2016 18:06
YuS_two

Цитата:
Отнюдь, это всё про то же

В процитированном вами сообщении вопрос был - какого размера куча переменных у вас вылезает по 'set p'.

Цитата:
никто не обязан писать код только с помощью циклов... Всего лишь пример, что это можно сделать без цикла

Да никто вообще никому ничего не обязан по определению. Но когда один путь - наглядный, быстрый и без ограничений, а второй - наоборот, это наталкивает на определенные выводы.

Цитата:
По сути, там я приводил пример не как передавать переменную, а как можно использовать ключик /v в cmd.

Использовать-то так можно, но его "замечательности" этот ваш пример ни разу не иллюстрирует.

Цитата:
имеет значение только передача данных в переменную по конвееру и использование этих данных, так или иначе...

В соревнованиях по забиванию гвоздей микроскопом тоже имеет значение только инструмент.

Страницы: 123456789101112131415161718

Предыдущая тема: Не устанавливаются обои на рабочий стол (Windows 2003 x64)


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