cmdlets/Set-DebugServer1C.ps1


. $PSScriptRoot\CommonUtils\CommonUtils.ps1

New-Alias -Name 'Dbg-Srv1C' -Value 'Set-DebugServer1C'

#----------------------------------------------------------------------------------------
# запускает платформу 1С с переданными ключами командной строки
function Set-DebugServer1C {
<#
    .SYNOPSIS
        Включает/выключает режим отладки на сервере приложений 1С.
    .DESCRIPTION
        Запуск без параметров добавляет ключ отладки в строку запуска сервера 1С в реестре Windows
        и перезапускает службу сервера 1С.
 
    Псевдоним: Dbg-Srv1C
 
    .PARAMETER Off
        Отключает отладку на сервере 1С. Если указан, то ключ отладки будет удален из строки запуска сервера.
    .PARAMETER NotRestart
        Не перезапускать службу сервера 1С.
    .PARAMETER Wait
        Для завершения работы ждать подтверждения от пользователя.
#>

    [CmdletBinding()]# реагирует на стандартные параметры такие как -Verbose
    Param(
        [switch]$Off, # Выключить отладку
        [switch]$NotRestart, # Не перезапускать службу
        [switch]$Wait # Ожидать нажатия любой клавиши
    )
    
    $Servers1C = @() # Массив - имен служб серверов 1С
    $Servers1C += "1C:Enterprise 8.3 Server Agent"
    $Servers1C += "1C:Enterprise 8.3 Server Agent (x86-64)"

    foreach($NameService in $Servers1C) {SetDebug $NameService (-not $Off)}
    if ($Wait) { Wait-PressAnyKey }
}

#----------------------------------------------------------------------------------------
function SetDebug($ServiceName, $OnDebug=$True)
{
    $ServicePath = "HKLM:\SYSTEM\CurrentControlSet\services\" + $ServiceName
    
    if (-not(Test-Path $ServicePath)) {Return}

    $Service = Get-Item -path ($ServicePath)
    $ImagePath = $Service.GetValue("ImagePath")
    Write-Verbose "ImagePath = $ImagePath"
    if ($ImagePath -eq $null) 
    {
        Write-Warning ('Не обнаружен путь к файлу запуска службы "{0}"' -f $ServiceName)
        Return
    }
    $CurrentDebugON = $ImagePath -match "-debug" # текущее состояние отладки
    
    $NewImagePath = ""
    $Message = ""
    # Если надо включить и нет в реестре - добавим в ключ
    if ($OnDebug -and !$CurrentDebugON) {
        $NewImagePath = $ImagePath -replace "-srvc", "-DEBUG -srvc" # НЕ чувствителен к регистру
        $Message = "`n`tОтладка включена"
    }
    # Если надо выключить и есть в реестре - удалим из ключа
    elseif (!$OnDebug -and $CurrentDebugON) {
        $NewImagePath = ($ImagePath -replace "-debug ") -replace "-debug" # оператор -replace не чувствителен к регистру в отличие от метода .Replace()
        $Message = "`n`tОтладка отключена"
    }
    # Текущий статус
    elseif ($CurrentDebugON)
        {$Message = "`n`tОтладка включена"}
    else
        {$Message = "`n`tОтладка отключена"}
    
    #Если были изменения - запишем их
    if ($NewImagePath) {
        Set-ItemProperty -Path $ServicePath -Name "ImagePath" –Value $NewImagePath
        #Если нет запрета на перезапуск - перезапустим сервер
        if (!$NotRestart) {
            Restart-Service -Name $ServiceName
            $Message = $Message + "`n`tПерезапущен сервер"
        }
    }
    
    #Cообщим о результатах
    "{0}{1}" -f $ServiceName, $Message
    
}