cmdlets/Stop-1C.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
. $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 = завершить процессы не спрашивая
)
    $LinesSearch = $Search.Split(",")

    foreach ($LineFind in $LinesSearch) {
     
        Write-Verbose "Search = $LineFind"
        $Line = $LineFind.Replace(":","%").Replace("\","%").Replace("/","%").Replace("%%","%").Trim()
        Write-Verbose "Search_Replaced = $Line"

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

        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){
            Write-Warning ('"Процессы с фрагментом строки запуска "{0}" не обнаружены' -f $LineFind.Trim())
        }
        else {
            ''
            $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