Скрипт импорта Тнв теперь может импортировтаь данные по территории

This commit is contained in:
Антон Чичков 2016-08-19 17:58:30 +10:00
parent 789a13c196
commit 333a1a9436

View File

@ -1,94 +1,64 @@
 
######################################################################## # Параметры командной строки
# Настройки
########################################################################
# путь к фреймворку ЛЭРС УЧЕТ param (
$LersFrameworkPath = "C:\Program Files\LERS\Common\Framework\bin\Lers.System.dll" [Parameter(Mandatory=$true) ][string]$cityName,
[Parameter(Mandatory=$false)][string]$dateFromTo,
[Parameter(Mandatory=$false)][string]$territoryName
)
# Адрес сервера приложения ########################################################################
$ServerAddress = 'localhost' # Настройки
########################################################################
# Порт сервера приложения # путь к фреймворку ЛЭРС УЧЕТ
$ServerPort = 10000 $LersFrameworkPath = "C:\Program Files\LERS\Common\Framework\bin\Lers.System.dll"
# Имя входа/пароль для подключения к Серверу # Адрес сервера приложения
$Login = 'login' $ServerAddress = 'localhost'
$PassWord = 'password'
# адрес ресурса # Порт сервера приложения
$url = 'http://www.pogoda.ru.net/monitor.php' $ServerPort = 10000
# регулярное выражение, для нахождения url адреса заданного города # Имя входа/пароль для подключения к Серверу
# <a href="monitor.php?id=35229">Хабаровск</a> $Login = 'login'
$regExpressionCityFirst = '(?i:<a\shref="(.+)">' $PassWord = 'password'
$regExpressionCitySecond = '</a>)'
# регулярное выражение для поиска среднесуточной температуры # адрес ресурса
# <th class=black>5</th><td class=blue1>-21.0</td><td class=green>-15.1</td> $url = 'http://www.pogodaiklimat.ru/monitor.php'
$regExpressionTemperatureFirst = '(?i:<th\sclass=black>'
$regExpressionTemperatureSecond = '</th>\s*<td\sclass=\w+>[\d\.\-\+]+</td>\s*<td\sclass=\w+>([\d\.\-\+]+)</td>)'
################################################################## # регулярное выражение, для нахождения url адреса заданного города
# Подключаемые типы # <a href="monitor.php?id=35229">Хабаровск</a>
################################################################## $regExpressionCityFirst = '(?i:<a\shref="(.+)">'
$regExpressionCitySecond = '</a>)'
try # регулярное выражение для поиска среднесуточной температуры
{ # <th class=black>5</th><td class=blue1>-21.0</td><td class=green>-15.1</td>
$regExpressionTemperatureFirst = '(?i:<th\sclass=black>'
$regExpressionTemperatureSecond = '</th>\s*<td\sclass=\w+>[\d\.\-\+]+</td>\s*<td\sclass=\w+>([\d\.\-\+]+)</td>)'
##################################################################
# Подключаемые типы
##################################################################
try
{
# подключаем фреймворк # подключаем фреймворк
add-type -path $LersFrameworkPath add-type -path $LersFrameworkPath
} }
catch catch
{ {
write-host 'Ошибка. Не удалось загрузить файл Lers.System.dll. Проверьте правильность расположения файла. ' + $Error[0].Exception.Message write-host 'Ошибка. Не удалось загрузить файл Lers.System.dll. Проверьте правильность расположения файла. ' + $Error[0].Exception.Message
exit exit
} }
######################################################################## ########################################################################
# Функции # Функции
######################################################################## ########################################################################
# Проверяет заданы ли параметры настройки скрипта # возвращает содержимое html страницы по адресу url ввиде строки
Function CheckParameters($url, $ServerAddress, $ServerPort, $Login, $PassWord) Function Get-WwwString([string]$url, [string]$Encoding = "windows-1251")
{ {
try
{
if ($url -eq '')
{
throw new-object Exception('Адрес сайта мониторинга погоды не задан.')
}
if ($ServerAddress -eq '')
{
throw new-object Exception('Адрес сервера ЛЭРС УЧЕТ не задан.')
}
if (($ServerPort -eq $null) -or ($ServerPort -eq 0) -or ($ServerPort -eq ''))
{
throw new-object Exception('Порт сервера ЛЭРС УЧЕТ не задан.')
}
if ($Login -eq '')
{
throw new-object Exception('Имя входа в ЛЭРС УЧЕТ не задано.')
}
if ($PassWord -eq '')
{
throw new-object Exception('Пароль для входа в ЛЭРС УЧЕТ не задан.')
}
}
catch
{
throw new-object Exception('Параметры скрипта не настроены. ', $Error[0].Exception)
}
}
##################################################################
# возвращает содержимое html страницы по адресу url ввиде строки
Function Get-WwwString([string]$url, [string]$Encoding = "windows-1251")
{
try try
{ {
# создаем web client # создаем web client
@ -104,37 +74,20 @@
{ {
throw new-object Exception('Не удалось загрузить html страницу по адресу ' + $url + '.', $Error[0].Exception) throw new-object Exception('Не удалось загрузить html страницу по адресу ' + $url + '.', $Error[0].Exception)
} }
} }
################################################################## #>
# возращает описание исключений
Function GetFullExceptionMessage([Exception]$exc)
{
if($exc -eq $null)
{
return ''
}
$msg = $exc.Message
if ($exc.InnerException -ne $null) ################################################################
{ # возвращает url адрес на страницу заданного города
$mes = GetFullExceptionMessage $exc.InnerException # $reply - содержимое html страницы ввиде строки
$msg = $msg + ' ' + $mes # $gorod - имя города
} # $url - адрес страницы мониторинга погоды
################################################################
return $msg Function Get-CityUrl($reply, $gorod, $url)
} {
##########################################################################
# возвращает url адрес на страницу заданного города
# $reply - содержимое html страницы ввиде строки
# $gorod - имя города
# $url - адрес страницы мониторинга погоды
Function Get-CityUrl($reply, $gorod, $url)
{
try try
{ {
# регулярное выражение, для нахождения url адреса заданного города # регулярное выражение, для нахождения url адреса заданного города
@ -158,16 +111,17 @@
{ {
throw new-object Exception('Не удалось получить ссылку на страницу города - ' + $gorod + '.', $Error[0].Exception) throw new-object Exception('Не удалось получить ссылку на страницу города - ' + $gorod + '.', $Error[0].Exception)
} }
} }
##########################################################################
# возвращает хеш-таблицу среднесуточной температуры наружного воздуха за указанный период времени ################################################################
# dateFrom - дата начало периода # возвращает хеш-таблицу среднесуточной температуры наружного воздуха за указанный период времени
# dateTo - дата окончания периода # dateFrom - дата начало периода
# link - url города # dateTo - дата окончания периода
Function Get-CityTemperature($dateFrom, $dateTo, $link) # link - url города
{ ################################################################
Function Get-CityTemperature($dateFrom, $dateTo, $link)
{
try try
{ {
$today = [DateTime]::Today $today = [DateTime]::Today
@ -204,6 +158,7 @@
# ссылка на страницу за указанный месяц и год # ссылка на страницу за указанный месяц и год
$ref = $link + '&month=' + $dateFrom.Month + '&year=' + $dateFrom.Year $ref = $link + '&month=' + $dateFrom.Month + '&year=' + $dateFrom.Year
Write-Host $ref
# загружаем html страницу заданного месяца и года # загружаем html страницу заданного месяца и года
$html = Get-WwwString $ref $html = Get-WwwString $ref
} }
@ -234,70 +189,15 @@
{ {
throw new-object Exception('Ошибка получения среднесуточной температуры за указанный период. ', $Error[0].Exception) throw new-object Exception('Ошибка получения среднесуточной температуры за указанный период. ', $Error[0].Exception)
} }
} }
##########################################################################
# возвращает входные параметры
Function Arguments($inArgs)
{
try
{
# проверяем количество параметров
if($inArgs.Length -eq 0)
{
throw new-object Exception('Отсутствуют параметры командной строки.')
}
# возвращает введенное имя города
$gorod = $inArgs[0]
$gorod
[DateTime]$dateTo = [System.DateTime]::Today.AddDays(-1)
[DateTime]$dateFrom = $dateTo
if($inArgs.Length -eq 2)
{
$DateTimeStr = $inArgs[1]
$DateTimeStr = $DateTimeStr.Split('-', [System.StringSplitOptions]::RemoveEmptyEntries)
if($DateTimeStr.Length -ne 2) ################################################################
{ # Функция подключается к серверу и возвращает объект сервера
throw new-object Exception('Период времени задан неверно.') ################################################################
} Function ConnectToServer()
{
# дата начало периода
if (![DateTime]::TryParse($DateTimeStr[0], [ref]$dateFrom))
{
throw new-object Exception('Дата начала периода задана в неверном формате. Формат даты: dd.mm.yyyy')
}
# дата конца периода
if (![DateTime]::TryParse($DateTimeStr[1], [ref]$dateTo))
{
throw new-object Exception('Дата окончания периода задана в неверном формате. Формат даты: dd.mm.yyyy')
}
}
# возвращаем дату начало/конца
$dateFrom
$dateTo
}
catch
{
throw new-object Exception('Ошибка разбора параметров коммандной строки. ', $Error[0].Exception)
}
}
##########################################################################
# Функция подключается к серверу автоматизации и возвращает объект сервера
Function ConnectToServer()
{
try try
{ {
Write-Host 'подключаемся к серверу по адресу ' $ServerAddress ':' $ServerPort Write-Host 'подключаемся к серверу по адресу ' $ServerAddress ':' $ServerPort
@ -316,15 +216,16 @@
{ {
throw new-object Exception('Не удалось подключится к серверу ЛЭРС УЧЕТ. ', $Error[0].Exception) throw new-object Exception('Не удалось подключится к серверу ЛЭРС УЧЕТ. ', $Error[0].Exception)
} }
} }
##########################################################################
# функция сохраняет данные о температуре на сервере ЛЭРС УЧЕТ ################################################################
# $server - сервер автоматизации # функция сохраняет данные о температуре на сервере ЛЭРС УЧЕТ
# $tempTable - таблица среднесуточных температур # $server - сервер автоматизации
Function SaveTemperatureToServer ($server, $tempTable) # $tempTable - таблица среднесуточных температур
{ ################################################################
Function SaveTemperatureToServer ($server, $territory, $tempTable)
{
Write-Host 'Cохраняем данные на сервере ЛЭРС УЧЕТ' Write-Host 'Cохраняем данные на сервере ЛЭРС УЧЕТ'
try try
{ {
@ -344,7 +245,8 @@
$value = [Convert]::ToSingle($value.Replace(".",$separator)) $value = [Convert]::ToSingle($value.Replace(".",$separator))
$record = New-Object Lers.Data.OutdoorTemperatureRecord($dt) $record = New-Object Lers.Data.OutdoorTemperatureRecord($dt, $territory)
$record.Value = $value $record.Value = $value
$temperature[$i] = $record $temperature[$i] = $record
@ -359,21 +261,157 @@
{ {
throw new-object Exception('Не удалось сохранить данные среднесуточной температуры на сервере ЛЭРС учет. ', $Error[0].Exception) throw new-object Exception('Не удалось сохранить данные среднесуточной температуры на сервере ЛЭРС учет. ', $Error[0].Exception)
} }
}#>
#################################################
# Возвращает территорию, в котороую будет сохраняться температура
#################################################
Function GetTerritory($server)
{
if ($territoryName -eq "")
{
$server.Territories.DefaultTerritory
}
else
{
$territoryList = $server.Territories.GetList()
foreach ($territory in $territoryList)
{
if ($territory.Name -eq $territoryName)
{
$territory
return
}
} }
########################################################################## throw new-object Exception("На сервере не найдена территория $territoryName")
# Точка входа }
########################################################################## }
#################################################
# Возвращает входные параметры
#################################################
Function GetFromToDate($inArgs)
{
try try
{ {
[DateTime]$dateTo = [System.DateTime]::Today.AddDays(-1)
[DateTime]$dateFrom = $dateTo
if ($dateFromTo -ne "")
{
$dateFromTo = $dateFromTo.Split('-', [System.StringSplitOptions]::RemoveEmptyEntries)
if($dateFromTo.Length -ne 2)
{
throw new-object Exception('Период времени задан неверно.')
}
# дата начало периода
if (![DateTime]::TryParse($dateFromTo[0], [ref]$dateFrom))
{
throw new-object Exception('Дата начала периода задана в неверном формате. Формат даты: dd.mm.yyyy')
}
# дата конца периода
if (![DateTime]::TryParse($dateFromTo[1], [ref]$dateTo))
{
throw new-object Exception('Дата окончания периода задана в неверном формате. Формат даты: dd.mm.yyyy')
}
}
# возвращаем дату начало/конца
$dateFrom
$dateTo
}
catch
{
throw new-object Exception('Ошибка разбора параметров коммандной строки. ', $Error[0].Exception)
}
}
#################################################
# Проверяет заданы ли параметры настройки скрипта
#################################################
Function CheckParameters($url, $ServerAddress, $ServerPort, $Login, $PassWord)
{
try
{
if ($url -eq '')
{
throw new-object Exception('Адрес сайта мониторинга погоды не задан.')
}
if ($ServerAddress -eq '')
{
throw new-object Exception('Адрес сервера ЛЭРС УЧЕТ не задан.')
}
if (($ServerPort -eq $null) -or ($ServerPort -eq 0) -or ($ServerPort -eq ''))
{
throw new-object Exception('Порт сервера ЛЭРС УЧЕТ не задан.')
}
if ($Login -eq '')
{
throw new-object Exception('Имя входа в ЛЭРС УЧЕТ не задано.')
}
if ($PassWord -eq '')
{
throw new-object Exception('Пароль для входа в ЛЭРС УЧЕТ не задан.')
}
}
catch
{
throw new-object Exception('Параметры скрипта не настроены. ', $Error[0].Exception)
}
}
#################################################
# возращает описание исключений
#################################################
Function GetFullExceptionMessage([Exception]$exc)
{
if($exc -eq $null)
{
return ''
}
$msg = $exc.Message
if ($exc.InnerException -ne $null)
{
$mes = GetFullExceptionMessage $exc.InnerException
$msg = $msg + ' ' + $mes
}
return $msg
}
##########################################################################
# Точка входа
##########################################################################
try
{
Write-Host 'Запуск импорта данных среднесуточной температуры с сайта мониторинга погоды.' Write-Host 'Запуск импорта данных среднесуточной температуры с сайта мониторинга погоды.'
# проверяем параметры настройки скрипта # проверяем параметры настройки скрипта
CheckParameters $url $ServerAddress $ServerPort $Login $PassWord CheckParameters $url $ServerAddress $ServerPort $Login $PassWord
#param[0] = город, param[1] = дата_начала, param[2] = дата_окончания
[object[]]$param = Arguments $Args #param[0] = город, param[1] = дата_начала, param[2] = дата_окончания, param[3] = территория
[object[]]$param = GetFromToDate
Write-host 'Загружаем ресурс ' $url Write-host 'Загружаем ресурс ' $url
@ -381,25 +419,28 @@
$reply = Get-WwwString $url $reply = Get-WwwString $url
# получаем ссылку на страницу, указанного города # получаем ссылку на страницу, указанного города
$link = Get-CityUrl $reply $param[0] $url $link = Get-CityUrl $reply $cityName $url
# загружаем таблицу с температурами наружного воздуха # загружаем таблицу с температурами наружного воздуха
$tempTable = Get-CityTemperature $param[1] $param[2] $link Write-Host $param[0]
Write-Host $param[1]
Write-host $link
$tempTable = Get-CityTemperature $param[0] $param[1] $link
write-host 'Получены среднесуточные температуры.' write-host 'Получены среднесуточные температуры.'
# подключаемся к серверу ЛЭРС # подключаемся к серверу ЛЭРС
$server = ConnectToServer $server = ConnectToServer
$territory = GetTerritory $server
# сохраняем температуру на сервере # сохраняем температуру на сервере
SaveTemperatureToServer $server $tempTable SaveTemperatureToServer $server $territory $tempTable
Write-Host 'Импорт температур успешно завершен.' Write-Host 'Импорт температур успешно завершен.'
} }
catch catch
{ {
write-host 'Ошибка импорта температур. ' (GetFullExceptionMessage $Error[0].Exception) write-host 'Ошибка импорта температур. ' (GetFullExceptionMessage $Error[0].Exception)
exit exit
} }
########################################################################