cmdlets/Stop-1C.ps1

. $PSScriptRoot\CommonUtils\CommonUtils.ps1

New-Alias -Name 'Kill-1C' -Value 'Stop-1C'

#----------------------------------------------------------------------------------------
# Завершает процессы платформы 1С
function Stop-1C {
<#
    .SYNOPSIS
        Завершает процессы платформы 1С.
    .DESCRIPTION
        Выводит список всех запущенных процессов платформы 1С и ожидает подтверждения пользователя для завершения.
        Если передана строка поиска, то будут найдены все процессы платформы 1С
        содержащие в своей командной строке запуска переданную строку.
         
    Псевдоним: Kill-1C
 
    .PARAMETER Search
        Фрагмент строки запуска (или фрагменты через запятую) содержание которого будет определяться в командной строке запуска платформы 1С.
        Псевдонимы: s, filter, f
    .PARAMETER IncludeServer1C
        Включить процессы сервера 1С в список к удалению.
        По умолчанию процессы сервера 1С в список к удалению не включаются.
    .PARAMETER Force
        Завершить все найденные процессы без вопросов.
    .EXAMPLE
        #Завершить все запущенные процессы в режиме предприятия:
        Stop-1C ENTERPRISE
    .EXAMPLE
        #Завершить все процессы к конкретной базе:
        Stop-1C '/IBName"ИмяБазы"'
#>


[CmdletBinding()]
param(
    [Alias("s", "filter", "f")][string]$Search, # строка поиска в командной строке запуска процесса
    [Parameter(HelpMessage="IncludeServer1C = false")][switch]$IncludeServer1C, # По умолчанию процессы сервера 1С исключены из удаления
    [switch]$Force # True = завершить процессы не спрашивая
)
    if ($IncludeServer1C){
        $Process1C = Get-Process -Name 1cv8*,ragent,rmngr,rphost,dbda
    }else{
        $Process1C = Get-Process -Name '1cv8*'
    }

    $LinesSearch = $Search.Split(",")
    foreach ($LineFind in $LinesSearch) {
    
        $Filter = "*$LineFind*"
        if ($IncludeServer1C){
            $Process = $Process1C | Where-Object {$_.CommandLine -Like $Filter -or $_.CommandLine -Like ""}
        }else{
            $Process = $Process1C | Where-Object {$_.CommandLine -Like $Filter}
        }

        Write-Verbose "Process = $Process"
        if($Process){
            ''
            if ($Force) {
                $Result = Terminate-Process $Process -Force
            }
            else {
                $Result = Terminate-Process $Process
                if (Get-Permission "Завершить"){
                    ''
                    $Result = Terminate-Process $Process -Force
                }
            }
        }
    } # foreach $LinesSearch
}# end of Stop-1C

#----------------------------------------------------------------------------------------
# Завершает переданные процессы
function Terminate-Process
{

[CmdletBinding()]
param(
    $Process, # массив процессов
    [switch]$Force
)
    $Result = $false
    
    $Force = $Force -and $DebugPreference -eq 'SilentlyContinue'
    
    $Text="Будет завершен процесс:"; $Color='White'
    if($Force){$Text="Завершен процесс:"; $Color='Yellow'}
    foreach($Proc in $Process)
    {
        Write-Host $Text -ForegroundColor DarkGray
        Write-Host ("{0} PID = {1}; CommandLine = {2}" -f $Proc.Name, $Proc.Id, $Proc.CommandLine) -ForegroundColor $Color
        if ($Force){
            Get-Process -Id $Proc.Id | ForEach-Object{$_.Kill()}
        }
    }
    Return $Result        
}# end Terminate-Process