Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Считать переменную из файла

Ответить
Настройки темы
VBS/WSH/JS - Считать переменную из файла

Пользователь


Сообщения: 50
Благодарности: 0

Профиль | Отправить PM | Цитировать


Приветствую уважаемый форум и прошу помощи!

Есть скрипт на VBS, делающий архив баз 1С
В скрипте как переменная указывается название базы, которую надо заархивировать. Баз стало много и хотелось бы бэкапить их одним скриптом и одним заданием.
Видится, что существующий скрипт надо обернуть в цикл, который будет считывать из текстового файла название базы (одна строка - одно название базы), записывать его в некую переменную, которая будет подставляться в нужное место строки архивации и так для всех указанных баз.
Поскольку я абсолютный чайник в VBS, очень прошу дать наводку, примеры...

Заранее СПАСИБО :-)

Отправлено: 15:34, 24-06-2016

 

Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Вариант 1.
Код: Выделить весь код
' Cписок баз
MasNames = Array("Base1", _
                "Base2", _
                "Base3")

Mas_1 = LBound(MasNames)
Mas_N = UBound(MasNames)

For Mas_i = Mas_1 To Mas_N
    Call ArcBackups(MasNames(Mas_i))
Next

Sub ArcBackups(BaseName)
    MsgBox BaseName
End Sub
Существующий скрипт надо оформить в виде подпрограммы (у меня условно ArcBackups), и дописать вызывающую её часть, которая будет передавать в эту подпрограмму в виде аргумента имя базы. Как вариант, список имён можно определить в массиве в этой вызывающей процедуре. Достоинство варианта - не надо держать еще какой-то текстовый файл.

Вариант 2. Идеология та же, но, по Вашей идее, список баз храним в текстовом файле
Код: Выделить весь код
SpisNames = "Z:\я16062417.txt"   'Cписок баз

Set FSO = CreateObject("Scripting.FileSystemObject")

If FSO.FileExists(SpisNames) Then
    Set FSpis = FSO.OpenTextFile(SpisNames, 1)
    Do
        iString = FSpis.ReadLine
        If Len(Trim(iString)) <> 0 Then Call ArcBackups(iString)
    Loop While Not FSpis.AtEndOfStream
    FSpis.Close
End If

Sub ArcBackups(BaseName)
    MsgBox BaseName
End Sub
Что в текстовом файле Z:\я16062417.txt
Код: Выделить весь код
Base1
Base2
Base3


Base4
Base5

Base6
Base7




Base222


Вариант 3. И всё-таки я бы предпочел сделать эту работу в cmd - скрипте, ИМХО, надёжнее получится. Но, не зная подробностей Вашего задания, его не привожу.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 24-06-2016 в 17:40.

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:51, 24-06-2016 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 50
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Вариант 3. И всё-таки я бы предпочел сделать эту работу в cmd - скрипте, ИМХО, надёжнее получится. Но, не зная подробностей Вашего задания, его не привожу. »
Большое спасибо, буду разбираться с предложенным Вами.
Третий вариант не получится - там задача сначала пройтись по всем существующим в кластере 1С соединеным клиентам и выкинуть их из базы В cmd (насколько мне известно) такое не получится

А подскажите как ?
Цитата megaloman:
Существующий скрипт надо оформить в виде подпрограммы
Положу сюда тело скрипта (если это не оффтоп)
СКРИПТ

Код: Выделить весь код
'имя пользователя базы 1С:Предприятия
UserName = "user" 
'пароль пользователя базы 1С:Предприятия
UserPass = "pass"
'имя сервера 1С:Предприятия
ServerName = "server"
'имя базы 1С:Предприятия к которой подключаемся
BaseName = "test_baza"
LockPermissionCode = "123456" 

LockMessageText = "БАЗА ЗАКРЫТА НА СОЗДАНИЕ РЕЗЕРВНОЙ КОПИИ И ОБНОВЛЕНИЕ."

Dim Connector
Dim AgentConnection
Dim Cluster
Dim WorkingProcess
Dim WorkingProcessConnection
Dim ibDesc
Dim connections
Dim ConnectString

Set connector = CreateObject("v83.COMConnector.1")
Set AgentConnection = Connector.ConnectAgent(ServerName)
Set Cluster = AgentConnection.GetClusters()(0)

'Указываем доступ к консоли 1С:Предприятия (только в том случае если определён администратор кластера, иначе прописать просто " " (пробелЫ))
AgentConnection.Authenticate Cluster, " ", " "
'Список процессов кластера
Processes = AgentConnection.GetWorkingProcesses(Cluster)
Dim j
'Перебираем все процессы в кластере
For j = LBound(Processes) To UBound(Processes)
	Set WorkingProcess = AgentConnection.GetWorkingProcesses(Cluster)(j)
	'Проверяем на наличие остановленых процессов
	If (WorkingProcess.MainPort <> "0") Then
		ConnectString = WorkingProcess.HostName & ":" & WorkingProcess.MainPort
		Set WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString)
		WorkingProcessConnection.AddAuthentication UserName, UserPass
		InfoBases  = WorkingProcessConnection.GetInfoBases()
		For Each InfoBase In InfoBases
			' Ищем нужную базу
			If UCase(InfoBase.Name) = UCase(BaseName) Then
				' Устанавливаем запрет на подключение новых соединений
				InfoBase.ConnectDenied = True
				InfoBase.DeniedFrom = CStr(Now())
				' Запрет действует 15 минут, если скрипт не отработает нормально
				InfoBase.DeniedTo = CStr(Now() + 1 / 96 * 1)
				InfoBase.DeniedMessage = LockMessageText
				InfoBase.PermissionCode = LockPermissionCode
				WorkingProcessConnection.UpdateInfoBase (InfoBase)
			End If
		Next
		Set ibDesc = WorkingProcessConnection.CreateInfoBaseInfo()
		ibDesc.Name = BaseName
		Connections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc)
		'Удаление всех соединений заданной ИБ сервера 1С
		Dim i
		Dim Connection
		For i = LBound(Connections) To UBound(Connections)
			Set Connection = connections(i)
			If (Connection.AppID <> "COMConsole") Then
				WorkingProcessConnection.Disconnect Connection
			End If
		Next
	End If
Next
'''''''''''''''''''''''''''''


strComm  = """C:\Program Files (x86)\1cv8\8.3.4.437\bin\1cv8.exe"" CONFIG /S"& ServerName &"\"& BaseName &" /Nuser /Ppass /UC"& LockPermissionCode &" /DumpIB ""\\SERVER\BACKUP\1C\"& Dat & BaseName &".dt"" /Out ""\\SERVER\BACKUP\1C\log\"& Dat & BaseName &"_dump.log"""
strComm2 = """C:\Program Files (x86)\1cv8\8.3.4.437\bin\1cv8.exe"" CONFIG /S"& ServerName &"\"& BaseName &" /Nuser /Ppass /UC"& LockPermissionCode &" /UpdateDBCfg /Out ""\\SERVER\BACKUP\1C\log\"& Dat & BaseName &"_update.log"""
Set oWshShell = CreateObject("WScript.Shell")
oWshShell.Run strComm, 0, true
oWshShell.Run strComm2, 0, true

' Отключаем блокировку базы
InfoBases  = WorkingProcessConnection.GetInfoBases()
For Each InfoBase In InfoBases
	' Ищем нужную базу
	If UCase(InfoBase.Name) = UCase(BaseName) Then
		' Отключаем запрет на подключение новых соединений
		InfoBase.ConnectDenied = False
		'InfoBase.DeniedMessage = ""
		'InfoBase.PermissionCode = ""
		WorkingProcessConnection.UpdateInfoBase (InfoBase)
	End If
Next

Отправлено: 18:22, 24-06-2016 | #3


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Udar_Nick, Я не уверен, что получится с Вашим конкретным скриптом, но попробуйте вместо моего MsgBox BaseName (или ниже, для отладки) вставить полностью Ваш скрипт. В Вашем скрипте закомментируйте строку (в начале строки поставьте ' ). Случайно у нас имена Вашей переменной и параметра моей процедуры совпали

' BaseName = "test_baza"

Естественно, в вызывающем модуле пропишите Ваши имена баз, пару штук для начала.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 24-06-2016 в 21:28.

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:27, 24-06-2016 | #4


Ветеран


Contributor


Сообщения: 2708
Благодарности: 1684

Профиль | Отправить PM | Цитировать


Udar_Nick, Вот и Вариант 3.
Пишем bat-файл, где вызываем Ваш vbs-скрипт (я обозвал файл с ним ArcBackups.vbs) и в параметре передаём в него имя базы
Код: Выделить весь код
@Echo On
wscript ArcBackups.vbs "Base1"
wscript ArcBackups.vbs "Base2"
wscript ArcBackups.vbs "Base3"
Ваш скрипт слегка дорабатываем:
Код: Выделить весь код
Set WS_arg=WScript.Arguments

If WS_arg.Count <> 0 Then
        BaseName=WS_arg(0)
	MsgBox BaseName
End If
Опять же, в батнике пропишите свои имена баз, вместо моего MsgBox BaseName (или ниже, для отладки) вставить полностью Ваш скрипт, лишь в Вашем скрипте закомментируйте строку (в начале строки поставьте ' ) где Вы указываете имя базы.

' BaseName = "test_baza"

ИМХО, этот вариант должен работать.
Если будете настаивать, можно написать в батнике и чтение имён из текстового файла, имхо, это не имеет смысла.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:27, 24-06-2016 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата megaloman:
Код: Выделить весь код
Mas_1 = LBound(MasNames)
Mas_N = UBound(MasNames)
For Mas_i = Mas_1 To Mas_N
»
Тут можно просто «For Each MasName In MasNames» применить.
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:28, 24-06-2016 | #6


Пользователь


Сообщения: 50
Благодарности: 0

Профиль | Отправить PM | Цитировать


а научите пожалуйста как сделать так, чтобы в случае ошибки в выполнении строки:
Код: Выделить весь код
oWshShell.Run strComm, 0, true
создавался файл Error.pid в определенной папке

Отправлено: 14:46, 28-06-2016 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Udar_Nick, «в случае ошибки» — что именно Вы под этим подразумеваете?

Отправлено: 15:27, 28-06-2016 | #8


Пользователь


Сообщения: 50
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
Udar_Nick, «в случае ошибки» — что именно Вы под этим подразумеваете? »
в моем скрипте эта строчка вызывает 1С:
Код: Выделить весь код
C:\Program Files (x86)\1cv8\8.3.4.437\bin\1cv8.exe
с некими параметрами. Делается дамп базы данных.
Хотелось бы, если errorlevel выполнения этой строки не 0 (т.е произошла какая-то ошибка), то сделать файлик error.pid (и записать в него errorlevel например). Нужно для мониторинга Нагиосом

в cmd это вот так выглядит:
Код: Выделить весь код
set RunProgramm = "c:\program.exe param1"
%RunProgramm%
if %ERRORLEVEL% GTR 0 goto err

:err
echo %ERRORLEVEL% >> c:\error.pid

Отправлено: 15:50, 28-06-2016 | #9


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
Dim lngErrLevel

lngErrLevel = oWshShell.Run(strComm, 0, True)

If lngErrLevel Then
	With WScript.CreateObject("Scripting.FileSystemObject").CreateTextFile("c:\error.pid")
		.Write CStr(lngErrLevel)
		.Close
	End With
End If
Цитата Udar_Nick:
Нужно для мониторинга Нагиосом »
Надеюсь, «Нагиос» удаляет этот файл после обработки?

Далее, в одном случае Вы пишете, чтобы файл «создавался», а ниже приводите пример дополнения файла данными (а не создания).
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:40, 28-06-2016 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Считать переменную из файла

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - [решено] Построчное чтение из файла в переменную Elven Скриптовые языки администрирования Windows 10 05-02-2015 16:55
CMD/BAT - [решено] Копирование в переменную значения из текстового файла idlazarev_alex@vk Скриптовые языки администрирования Windows 1 05-04-2014 22:11
Разное - Почему программе не получается считать из файла данные,записанные туда др.программой? Nayan Программирование и базы данных 8 04-05-2011 20:31
[решено] Считать инфу из разделов INI файла в разные массивы. FlatX007 AutoIt 18 23-12-2010 22:57
CMD/BAT - [решено] Чтение строки из файла в переменную Николя Скриптовые языки администрирования Windows 42 17-01-2010 19:42




 
Переход