<# .SYNOPSIS Closes a program's processes .DESCRIPTION This script closes a program's processes gracefully. .PARAMETER FullProgramName Specifies the full program name .PARAMETER ProgramName Specifies the program name .PARAMETER ProgramAliasName Specifies the program alias name .EXAMPLE PS> ./close-program "Google Chrome" "chrome.exe" .NOTES Author: Markus Fleschutz · License: CC0 .LINK https://github.com/fleschutz/PowerShell #> param([string]$FullProgramName = "", [string]$ProgramName = "", [string]$ProgramAliasName = "") try { if ($ProgramName -eq "") { get-process | where-object {$_.mainWindowTitle} | format-table Id, Name, mainWindowtitle -AutoSize $ProgramName = read-host "Enter program name" } if ($FullProgramName -eq "") { $FullProgramName = $ProgramName } $Processes = get-process -name $ProgramName -errorAction 'silentlycontinue' if ($Processes.Count -ne 0) { foreach ($Process in $Processes) { $Process.CloseMainWindow() | Out-Null } start-sleep -milliseconds 100 stop-process -name $ProgramName -force -errorAction 'silentlycontinue' } else { $Processes = get-process -name $ProgramAliasName -errorAction 'silentlycontinue' if ($Processes.Count -eq 0) { throw "$FullProgramName is not started yet" } foreach ($Process in $Processes) { $_.CloseMainWindow() | Out-Null } start-sleep -milliseconds 100 stop-process -name $ProgramName -force -errorAction 'silentlycontinue' } if ($($Processes.Count) -eq 1) { "✔️ $FullProgramName closed, 1 process stopped" } else { "✔️ $FullProgramName closed, $($Processes.Count) processes stopped" } exit 0 # success } catch { "⚠️ Error: $($Error[0]) ($($MyInvocation.MyCommand.Name):$($_.InvocationInfo.ScriptLineNumber))" exit 1 }