cmdlets/Stop-1C.ps1

. $PSScriptRoot\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 = завершить процессы не спрашивая
)
    Write-Verbose "Search = $Search"
    $Search = $Search.Replace(":","%").Replace("\","%").Replace("/","%").Replace("%%","%")
    Write-Verbose "Search_Replaced = $Search"

    $Filter = "Name LIKE '%1cv8%'"
    if($IncludeServer1C) {$Filter = "CommandLine LIKE '%1cv8%'"}
    if ($Search -ne "") {$Filter += "and CommandLine LIKE '%$Search%'"}

    Write-Verbose "IncludeServer1C = $IncludeServer1C"
    Write-Verbose "Filter = $Filter"
    Write-Verbose "Force = $Force"

    $Process = Get-WmiObject Win32_Process -Filter $Filter
    Write-Verbose "Process = $Process"
    if($Process -eq $null){Return}
    ''
    $Result = $false
    if ($Force) {$Result = Terminate-Process $Process -Force}
    else
    {
        $Result = Terminate-Process $Process
        if (Get-Permission "Завершить"){'';$Result = Terminate-Process $Process -Force}
    }
    #Return $Result
}# 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
        if ($Force){$Proc.Terminate() | Out-Null; $Result = $true}
        Write-Host ("PID = {0}; CommandLine = {1}" -f $Proc.ProcessID, $Proc.CommandLine) -ForegroundColor $Color
    }
    Return $Result        
}# end Terminate-Process