Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии - bat, cmd

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

Открыть новую тему     Написать ответ в эту тему

Maz



Дед Мазай
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Командная строка, батники\сценарии (bat, cmd)
часть 1 | часть 2 | часть 3 | часть 4 | часть 5
Вопросы, задачи и их решения по работе с командной строкой, файлами, а также сопутствующие ссылки.

Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!! Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.
 
Примечание: Большие куски кода заключайте в тэг [ more ].  

Смежные темы:
В помощь системному администратору > Автоматизация администрирования
Microsoft Windows > Сценарии Windows

Полезные ссылки:
· Из Windows XP Professional Product Documentation:
> Описание Cmd.exe > Command shell overview
> Using batch files > Using batch parameters > Using filters > Using command redirection operators
 
· Уроки bat-аники (для начинающих): первый и второй
· Курс из 19 лекций "Командная строка и сценарии Windows"
· Уильям Р. Станек - Командная строка Windows. Справочник администратора
 
· Выполнение BAT-скриптов без вызова окна консоли
· cmdow - изменение параметров и видимости дос-окна, Статья в КОМПЬЮТЕРРАONLINE
· Набор GNU утилит для win32
· HS_Packet.7z - Пакет утилит для организации интерфейса в bat-файлах
· blat - отправка почты из консоли
· Easy Batch Builder+Rus+Crack - Редактор BAT файлов.Через графический интерфейс программы вы сможете быстро конструировать пакетные файлы практически любой сложности. (В комплекте есть Лоадер созданный с помощью Sign Of Misery некоторые антивирусы обзывают его вирусом. Вам решать: ставить или не ставить) (ЗЕРКАЛО)
· Простой способ получать текущую дату всегда в одном формате (не зависит от языков и настроек) ещё и ещё
· Переход из 32-битной версии cmd.exe в 64-битную (1) (2)(3)
 
· Архив всевозможных версий cmd.exe (от Windows NT 3.51 до Windows 10) и command.com (DOS 5.0 и выше). Старые командные процессоры можно запускать на более новых ОС, хотя не всё может работать корректно. Подробная документация по командам cmd.exe и стандартным утилитам ОС для NT 3.51, NT 4.0, NT 5.0 (Windows 2000) и NT 5.2 (Windows Server 2003). Сборник представляет исторический интерес, а также незаменим для тех, у кого появилось желание сделать свои скрипты работоспобными не только на текущей версии ОС. Ссылки wdho.ru tinyupload.com dbree.org
 
· Сборник одним архивом: Сотни Win32 утилит командной строки, нетривиальные .cmd файлы, .bat miniperl скрипты (не требующие полноценной установки Perl), FAR Manager с плагинами и настройками, разное для DOS/DOSBox (откуда под Win32 интерес представляют три продвинутых "мультисистемных" .bat файла да ещё, может быть, оболочка Necromancer DOS Navigator с поддержкой LFN и доступом к буферу обмена Windows). Краткие описания всего - в файликах files.bbs

Всего записей: 37254 | Зарегистр. 26-02-2002 | Отправлено: 13:35 19-09-2020 | Исправлено: Maz, 07:16 24-04-2021
Fenrizz



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
M_Volkov
Если файл dt-выгрузки создаётся не одной транзакцией, то надо проверять не только, что он существует, но и что запись в него уже закончена, как я понимаю?

Всего записей: 360 | Зарегистр. 12-09-2017 | Отправлено: 09:14 29-01-2021
A27

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fenrizz, я указал .exe, чтобы было понятно, что в файле есть не читаемые символы, которые не обрабатываются циклом For. И в вашем примере нет findstr.exe.
 
M_Volkov,

Цитата:
пустой (или содержит пустую строку) или нет. Если log-файл не пустой, то bat-файл завершал свою работу.
 
Еще так же желательно, чтобы анализировал время изменения log-файла.

Цитата:
Этот bat-файл нужен для ночной dt-выгрузки 1С базы [?], поэтому имя файла выгрузки формируется из текущей даты, например, для сегодняшней: AAAAkit_28012021.dt. Как?

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

Код:
@Echo Off
Set Log=Путь к логу
Set Bases=Путь к базам
For %%A in ("%Log%") do (
Echo Log file date and time: %%~TA
If not %%~ZA==0 Exit/b
)
For /f "UseBackQ Tokens=*" %%A in ("%Log%") do (
Set "String=%%A"
Call Set String=%%String: =%%
If defined String Exit/b
)
For /f "Tokens=*" %%A in ('Dir/b/o-d "%Bases%\AAAAkit_*.dt" 2^>NUL') do (
Выгрузка...
Exit/b
)

Всего записей: 55 | Зарегистр. 30-03-2017 | Отправлено: 09:16 29-01-2021 | Исправлено: A27, 09:53 29-01-2021
Fenrizz



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
A27
Тогда, стандартными средствами, наверное, никак.
Можно использовать утилиту split из набора unxutils.

Всего записей: 360 | Зарегистр. 12-09-2017 | Отправлено: 09:26 29-01-2021
KiloSub



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fenrizz

Код:
for /F "tokens=*" %%A in (file.log) do set /a cnt+=1  

Зачем Вы все строки считаете? Может сразу

Код:
for /F "tokens=*" %%A in (file.log) do goto FINISH  

или

Код:
setlocal enabledelayedexpansion
set cnt=0
for /F "tokens=*" %%A in (file.log) do (
  set /a cnt+=1
  if !cnt! gtr 0 goto FINISH
)

Всего записей: 318 | Зарегистр. 30-05-2020 | Отправлено: 11:54 29-01-2021 | Исправлено: KiloSub, 12:20 29-01-2021
M_Volkov



Gold Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Fenrizz
Цитата:
Если файл dt-выгрузки создаётся не одной транзакцией... как я понимаю?
Нет, файл dt-выгрузки создаётся одной транзакцией!!! Пример dt-выгрузки. Для его создания обязательное условие - все пользователи должны выйти из базы. Но тут в моем случае есть особенность: бывает срочная работа (у нас автосервис), которую нужно закончить "сегодня", и выгонять компьютер с кассой очень нежелательно (кассир бывает закрывает смену удаленно с домашнего компьютера, но при этом компьютер с кассой должен быть подключен к базе). Поэтому пользователь может отказаться от завершения работы, не выходить из базы. А может просто забыть выйти, или не правильно выйти (только из терминала, не из базы). Поэтому регламентное задание запускается каждый час ночи, и прежде всего проверка следующих условий:
- существует ли сегодняшний файл dt-выгрузки, может он уже создан в предыдущий час этим же bat-файлом,
- нет ли пользователей в базе. Прямого метода не нашел, определяю по лог-файлу: пишу в него что ни будь при входе пользователя, и очищаю его (делаю пустым) при выходе последнего пользователя из самой базы.
 
Кстати, имя файл dt-выгрузки правильно формирую (должно быть \\corp.akit\workspace$\1c\1с_Архивы\AAAAkit\AAAAkit_ддммгггг.dt):
set BAK_NAME=\\corp.akit\workspace$\1c\1с_Архивы\AAAAkit\AAAAkit_%date:~0,2%%date:~3,2%%date:~6,4%.dt?
А если за ночь дата сменилась, есть возможность сформировать имя по "вчерашней" дате, дней в месяце разное?
 
Добавлено:
Файл dt-выгрузки не для архива (не только). Базы SQL, архивы делаются средствами SQL-сервера. Просто был случай SQL-сервер вышел из строя на неделю. Если бы не файл dt-выгрузки, не создали временную файловую базу, стояли бы...

Всего записей: 5355 | Зарегистр. 23-06-2008 | Отправлено: 13:07 29-01-2021 | Исправлено: M_Volkov, 13:30 29-01-2021
Pasha_ZZZ



Gold Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
M_Volkov
Цитата:
есть возможность сформировать имя по "вчерашней" дате
Самое простое - использовать date из unxutils например.

Всего записей: 9929 | Зарегистр. 11-03-2002 | Отправлено: 13:20 29-01-2021
M_Volkov



Gold Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Pasha_ZZZ
Подробней бы?

Всего записей: 5355 | Зарегистр. 23-06-2008 | Отправлено: 13:28 29-01-2021 | Исправлено: M_Volkov, 13:32 29-01-2021
los

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
M_Volkov
$ date
Fri Jan 29 14:13:15 MSK 2021
$ date --date='yesterday'
Thu Jan 28 14:13:16 MSK 2021

Всего записей: 3586 | Зарегистр. 08-09-2001 | Отправлено: 14:15 29-01-2021
Fenrizz



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тогда уж можно через PowerShell, без дополнительных утилит.
 

Код:
PowerShell -Command "(Get-Date).AddDays(-1) | Get-Date -Format 'ddMMyyyy'"

Всего записей: 360 | Зарегистр. 12-09-2017 | Отправлено: 15:11 29-01-2021 | Исправлено: Fenrizz, 15:21 29-01-2021
Smitis



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
M_Volkov

Цитата:
А если за ночь дата сменилась, есть возможность сформировать имя по "вчерашней" дате, дней в месяце разное?

Особенно классно получается, когда дата меняется между двумя опросами переменной date (маловероятно, но не настолько, чтобы игнорировать).
Для примера, работа с датой через гибридный cmd+js

Код:
@if (true == false) @end /*
@echo off
for /f "usebackq delims=" %%# in (`%SystemRoot%\system32\cscript.exe //nologo //e:javascript "%~f0" %*`) do set "dt=%%#"
echo date: %dt%
exit /b */
 
var dt = new Date(new Date().getTime()-3600000*24);
var datestring = dt.getFullYear()+"-"+("0"+(dt.getMonth()+1)).slice(-2)+"-"+("0"+dt.getDate()).slice(-2)+" "+("0"+dt.getHours()).slice(-2)+"-"+("0"+dt.getMinutes()).slice(-2)+"-"+("0"+dt.getSeconds()).slice(-2);
WScript.Echo(datestring);

Но лучше всего это делать через PowerShell, как выше советовали.

----------
Разум когда-нибудь победит

Всего записей: 2293 | Зарегистр. 09-02-2003 | Отправлено: 15:50 29-01-2021
M_Volkov



Gold Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
KiloSub
Цитата:
for /F "tokens=*" %%A in (file.log) do goto FINISH
Да, в лог-файле максимум одна строка (если есть, то пустая или нет). На FINISH переходит когда лог-файл пустой? Надо бы не пустой...

Всего записей: 5355 | Зарегистр. 23-06-2008 | Отправлено: 17:15 30-01-2021 | Исправлено: M_Volkov, 17:21 30-01-2021
GCRaistlin



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
M_Volkov

Цитата:
в лог-файле максимум одна строка.

< file set /p _A=|| echo File empty or can't be read

----------
Magically yours
Raistlin

Всего записей: 2988 | Зарегистр. 18-04-2005 | Отправлено: 17:24 30-01-2021
M_Volkov



Gold Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Запускаю свой bat-файл вручную, получаю:
Цитата:
"\\corp.akit\workspace$\1c\1с_Архивы\AAAAkit"
Указанный путь был использован при запуске CMD.EXE в качестве текущей папки.
CMD не поддерживают пути UNC. По умолчанию выбрана системная папка Windows.
Файл выгрузки \\corp.akit\workspace$\1c\1с_Архивы\AAAAkit\AAAAkit_%date:~0,2%%date:~3,2%%date:~6,4%.dt не создается, но похоже по тому как долго весит окно с этим сообщением делается. Делается ли AAAAkit_31.01.2021.dt , и где его искать?
 
Добавлено:
Такие пути UNC дали сисадмины. Как сделать чтобы bat-файл их понимал?

Всего записей: 5355 | Зарегистр. 23-06-2008 | Отправлено: 17:45 31-01-2021 | Исправлено: M_Volkov, 17:46 31-01-2021
Fenrizz



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
M_Volkov
https://codernotes.ru/articles/cmd-bat/cmd-exe-ne-podderzhivaet-puti-unc-v-kachestve-tekushhej-papki.html
 
Или переписать весь скрипт под PowerShell.

Всего записей: 360 | Зарегистр. 12-09-2017 | Отправлено: 18:21 31-01-2021 | Исправлено: Fenrizz, 18:34 31-01-2021
BorlandIMHO

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
M_Volkov

Цитата:
CMD не поддерживают пути UNC. По умолчанию выбрана системная папка Windows.

Сам пакетник лежит в той сетевой папке?
Если обязательно нужно сделать именно её текущей - можно воспользоваться командой
Код:
pushd "%~dp0"
При этом автоматически подключится сетевой диск и папка станет текущей (на свежеподключённом диске). По завершении работы с папкой команда
Код:
popd
вернёт текущую папку к предыдущему значению и отключит сетевой диск.

----------
http://www.imho.ws

Всего записей: 1157 | Зарегистр. 12-10-2006 | Отправлено: 18:39 31-01-2021
M_Volkov



Gold Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Fenrizz
Цитата:
Или переписать весь скрипт под PowerShell.
Это как? Например, этот
Код:
@echo off
rem Пауза 2 минуты
@ping localhost -w 1000 -n 121 > nul
rem Имя файлов выгрузки и лога
set BakName=\\corp.akit\workspace$\1c\1с_Архивы\AAAAkit\AAAAkit_%date:~0,2%%date:~3,2%%date:~6,4%.dt
set LogName=\\corp.akit\workspace$\1c\1с_Архивы\AAAAkit\AAAAkit.log
rem Непосредственно создание файла dt-выгрузки
"C:\Program Files (x86)\1cv8\8.3.10.2466\bin\1cv8s.exe" CONFIG /S andromeda\AAAAkit /DisableStartupMessages /DumpIB %BakName% /N"Администратор" /P"1001221" /Out "LogName" -NoTruncate /UC AllowRobotLogon


Всего записей: 5355 | Зарегистр. 23-06-2008 | Отправлено: 18:44 31-01-2021 | Исправлено: M_Volkov, 18:48 31-01-2021
yurkesha



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
M_Volkov
Цитата:
Указанный путь был использован при запуске CMD.EXE в качестве текущей папки.  
А собственно какая тебе разница в пути запуска? В приведенном скрипте все пути указаны абсолютно, текущая среда вообще роли не играет.
Сообщение вообще было выведено так как скрипт был запущен из "\\corp.akit\workspace$\1c\1с_Архивы\AAAAkit" - и де-факто сам скрипт можешь положить где угодно(если напрягает сообщение - положи на локальную машину).
А вот присвоения пора бы уже писать корректно:
Код:
set "BakName=\\corp.akit\workspace$\1c\1с_Архивы\AAAAkit\AAAAkit_%date:~0,2%%date:~3,2%%date:~6,4%.dt"
set "LogName=\\corp.akit\workspace$\1c\1с_Архивы\AAAAkit\AAAAkit.log"

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

Всего записей: 2701 | Зарегистр. 15-12-2003 | Отправлено: 20:48 31-01-2021 | Исправлено: yurkesha, 20:49 31-01-2021
M_Volkov



Gold Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
yurkesha
Цитата:
А вот присвоения пора бы уже писать корректно
Спс. Т.е. на это сообщение не обращать внимание? Пока переписал так
Код:
set "BakName=f:\workspace\1C\1с_Архивы\AAAAkit\AAAAkit_%date:~0,2%%date:~3,2%%date:~6,4%.dt"
set "LogName=f:\workspace\1C\1с_Архивы\AAAAkit\AAAAkit.log"
Но файл dt-выгрузки все равно не делается. Разбираюсь...
 
Добавлено:
bat-файл запуская самой 1С по завершению работы последнего пользователя.
Код:
    РежимБлокировки = ПолучитьБлокировкуУстановкиСоединений();
    ФайлВыгрузки = Новый Файл("\\corp.akit\workspace$\1c\1с_Архивы\AAAAkit\AAAAkit_" + Лев(Строка(ТекущаяДата()), 2) + Сред(Строка(ТекущаяДата()), 4, 2) + Сред(Строка(ТекущаяДата()), 7, 4) + ".dt");
    Если РежимБлокировки.Установлена И ТекущаяДата() >= НачалоДня(ТекущаяДата()) + 21*60*60 - 5*60 И Не ФайлВыгрузки.Существует() Тогда
        ЗапуститьПриложение("\\corp.akit\workspace$\1c\1с_Архивы\AAAAkit\AAAAkit.bat");
        пвПривилегированныйМодуль.СнятьБлокировкуСоединений();
    КонецЕсли;
Поэтому все проверки убрал из bat-файла, их делает 1С. В bat-файл добавил паузу на пару минут для завершения работы 1С.

Всего записей: 5355 | Зарегистр. 23-06-2008 | Отправлено: 08:29 01-02-2021 | Исправлено: M_Volkov, 12:50 01-02-2021
yurkesha



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
M_Volkov
Цитата:
set "BakName=f:\workspace\1C\1с_Архивы\AAAAkit\AAAAkit_%date:~0,2%%date:~3,2%%date:~6,4%.dt"


Цитата:
set "BakName=\\corp.akit\workspace$\1c\1с_Архивы\AAAAkit\AAAAkit_%date:~0,2%%date:~3,2%%date:~6,4%.dt"
А вот с этого места поподробнее:
- Почему пути изменились?
- Каким образом стартует скрипт?  
- От какого пользователя?
- Пользователь залогинен в системе или нет?
- Выполнялась ли проверка на доступность необходимых сетевых ресурсов в среде запуска?
И так далее...
 
 
Добавлено:

Цитата:
bat-файл запуская самой 1С по завершению работы последнего пользователя.

Вот тут не понял - от имени какого пользователя операционной системы стартует скрипт?

Всего записей: 2701 | Зарегистр. 15-12-2003 | Отправлено: 08:44 01-02-2021
Fenrizz



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
M_Volkov

Цитата:
Поэтому все проверки убрал из bat-файла, их делает 1С. В bat-файл добавил паузу на пару минут для завершения работы 1С.

Паузу лучше так делать:

Код:
TIMEOUT /T 120

Всего записей: 360 | Зарегистр. 12-09-2017 | Отправлено: 09:51 01-02-2021 | Исправлено: Fenrizz, 09:51 01-02-2021
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

Компьютерный форум Ru.Board » Компьютеры » Программы » Командная строка, батники, сценарии - bat, cmd


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.Board
© Ru.Board 2000-2020

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru