Запуск chdbfl с параметрами с помощью PowerShell

Что делать если Вам часто приходится запускать chdbfl на разных компьютерах для базы, которая располагается всегда в одном месте? Например, это может быть конфигурация АРМ кассира сети розничных магазинов. Каждый раз подключаться к пользователю или тем более объяснять как это сделать самостоятельно — никаких сил и нервов не хватит. Но можно написать скрипт, поместить его на рабочий стол и отдать пользователю.

Данный скрипт запускает chdbfl, вводит путь к базе данных, ставит флажок «Исправлять обнаруженные ошибки» и нажимает кнопку «Выполнить». Дождаться завершения и нажать кнопку «Закрыть» пользователь должен самостоятельно.

Скрипт предназначен для запуска chdbfl на компьютерах, на которых установлена платформа 1С 8.2, но Вы легко можете изменить путь расположения chdbfl самостоятельно.

Текст скрипта:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")

function Send-Keys ([string]$Window,[int]$Interval=50) #Устанавливаем аргументы и значение по умолчанию для $interval
{
begin #Блок begin выполняется 1 раз в начале скрипта
{
$shell = new-object -com WScript.Shell #Создаем объект WScript.Shell

$Comp = new-object Microsoft.VisualBasic.Devices.Computer

if ($window) #Если переменная $window не пуста
{
write-host "Waiting for window '$Window'" #Пишем на консоль состояние
while (!$shell.AppActivate($Window)) #Пока не активируем указанное окно...
{
start-sleep -milliseconds $Interval #...Ждем заданное время
}
}
}

process #Блок process выполняется для каждого объекта пришедшего через конвеер |, текущий объект доступен в переменной $_
{
$Comp.KeyBoard.SendKeys($_,$true)
start-sleep -milliseconds $Interval #Ждем
}
}


if (Test-Path -path "C:Program Files (x86)1cv82")
{
$PathTo1C = "C:Program Files (x86)1cv82";
}
else
{
$PathTo1C = "C:Program Files1cv82";
}
$Version1C = (Get-Command ($PathTo1C+"common1cestart.exe")).FileVersionInfo.FileVersion;

$xpath = "C:InfoBase1cv8.1cd";
$app = start-process ($PathTo1C+$Version1C+"inchdbfl.exe");
$app;
$xpath,"{TAB}","{+}","{TAB}", "{TAB}", "{ENTER}" | Send-Keys "Проверка физической целостности файла БД"
 

 

Обновление от 22.11.2013: необходимо, чтобы путь к базе данных не содержал символов кириллицы, иначе они будут заменены на абракадабры. Благодаря подсказке Serj1C, теперь путь к базе можеть содержать и кириллицу.

Так же можно создать ярлычок на рабочий стол с указанием базы: powershell.exe <ПутьКСкрипту> <ПолноеИмяФайлаБазыДанных>

Тогда объявление переменной $xpath будет иметь вид: $xpath = $args[0];

5 Comments

  1. Serj1C

    Победил проблему с русскими буквами:

    [System.Reflection.Assembly]::LoadWithPartialName(«Microsoft.VisualBasic»)
    
    function Send-Keys ([string]$Window,[int]$Interval=200) #Устанавливаем аргументы и значение по умолчанию для $interval
    {
    begin #Блок begin выполняется 1 раз в начале скрипта
    {
    $shell = new-object -com WScript.Shell #Создаем объект WScript.Shell
    
    $Comp = new-object Microsoft.VisualBasic.Devices.Computer
    
    if ($window) #Если переменная $window не пуста
    {
    write-host «Waiting for window ‘$Window'» #Пишем на консоль состояние
    while (!$shell.AppActivate($Window)) #Пока не активируем указанное окно…
    {
    start-sleep -milliseconds $Interval #…Ждем заданное время
    }
    }
    }
    
    process #Блок process выполняется для каждого объекта пришедшего через конвеер |, текущий объект доступен в переменной $_
    {
    $Comp.KeyBoard.SendKeys($_,$true)
    start-sleep -milliseconds 50 #Ждем
    }
    }
    
    
    if (Test-Path -path «C:Program Files (x86)1cv82»)
    {
    $PathTo1C = «C:Program Files (x86)1cv82»;
    }
    else
    {
    $PathTo1C = «C:Program Files1cv82″;
    }
    $Version1C = (Get-Command ($PathTo1C+»common1cestart.exe»)).FileVersionInfo.FileVersion;
    
    $xpath = «C:Кассандра1cv8.1cd»;
    $app = start-process ($PathTo1C+$Version1C+»inchdbfl.exe»);
    $app; $xpath,»{TAB}»,»{+}»,»{TAB}», «{TAB}», «{ENTER}» | Send-Keys «Проверка физической целостности файла БД»
    

    Показать

    Reply
  2. DAnry

    Если часто приходится запускать chdbfl — это ненормально.

    Reply
  3. cheburashka

    (2) DAnry, согласен, но бывают такие ситуации, когда выявить причину, из-за которой приходится прибегать к chdbfl, не получается.

    Reply
  4. DAnry

    Но это же не работа. В таком случае большая вероятность, что база рухнет и её не поднимешь chdbfl. Слишком большой риск.

    Reply
  5. CaSH_2004

    (2) Это так, но что если у вас 100 баз на 10 серверах и все нужно протестить? Будете вручную везде везде запускать и указывать базы? И к то му же эот для профилактики неплохо — точно будеш знать что тут все в порядке.

    (0) Я кстати тут в аналогичной разработке Запуск тестирования БД из командной строки. задавал вопрос автору как получить результат без визуального контроля — чтобы текст из окна возвращался, обещал подумать, но пока глухо.

    Было-бы неплохо авторам что то придумать иначе толку от таких поделок только 50%, т.к. ккак я говорил уже проверять результат всех проверок очень сложно.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *