core/os.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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
$Script:hostsPath = "$($env:windir)\system32\Drivers\etc\hosts" # Get the Handle.exe tool by Sysinternals $handleLink = "https://download.sysinternals.com/files/Handle.zip" $handleExternalToolsDir = "$Script:externalToolsPath\handle" if (!(Test-Path $handleExternalToolsDir)) { New-Item -Path $handleExternalToolsDir -ItemType Directory } $handleToolPath = "$handleExternalToolsDir\handle.exe" if (!(Test-Path $handleToolPath)) { $archive = "$handleExternalToolsDir\Handle.zip" try { Invoke-WebRequest -Uri $handleLink -OutFile $archive expand-archive -path $archive -destinationpath $handleExternalToolsDir . "$handleExternalToolsDir\Eula.txt" Remove-Item -Path $archive -Force } catch { Write-Error "Error fetching the handle tool from $handleLink auto unlocking files will not work." } } function os-popup-notification { Param ( [Parameter(Mandatory = $false)][string] $msg = "No message provided." ) [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") $objNotifyIcon = New-Object System.Windows.Forms.NotifyIcon $objNotifyIcon.Icon = "${PSScriptRoot}\..\resources\icon.ico" $objNotifyIcon.BalloonTipIcon = "Info" $objNotifyIcon.BalloonTipText = $msg $objNotifyIcon.BalloonTipTitle = "Powershell operation done." $objNotifyIcon.Visible = $True $objNotifyIcon.ShowBalloonTip(10000) } function os-test-isPortFree { Param($port) $openedSockets = Get-NetTCPConnection -State Listen $isFree = $true ForEach ($socket in $openedSockets) { if ($socket.localPort -eq $port) { $isFree = $false break } } return $isFree } <# .EXAMPLE $path = "tf.exe" execute-native "& `"$path`" workspaces `"C:\dummySubApp`"" #> function execute-native ([string]$command, [array]$successCodes) { $command = $command + " 2>&1" $output = Invoke-Expression $command if ($lastexitcode -and -not ($successCodes -and $successCodes.Count -gt 0 -and $successCodes.Contains($lastexitcode))) { throw "Error executing native operation ($command). Last exit code was $lastexitcode. Native call output: $output`n" } else { $output } } function unlock-allFiles ($path) { if (!$path -or !(Test-Path $path)) { throw "The supplied path `"$path`" was not found."; } if (!(Test-Path $handleToolPath)) { Write-Error "Handles tool not found. Unlocking open files will not work. Project files might need to be cleaned up manually if opened." } $handlesList = execute-native "& `"$handleToolPath`" /accepteula `"$path`"" $pids = New-Object -TypeName System.Collections.ArrayList $handlesList | ForEach-Object { $isFound = $_ -match "^.*pid: (?<pid>.*?) .*$" if ($isFound) { $id = $Matches.pid if (-not $pids.Contains($id)) { $pids.Add($id) > $null } } } $pids | ForEach-Object { Get-Process -Id $_ -ErrorAction SilentlyContinue | % { # $date = [datetime]::Now # "$date : Forcing stop of process Name:$($_.Name) File:$($_.FileName) Path:$($_.Path) `nModules:$($_.Modules)" | Out-File "$home\Desktop\unlock-allFiles-log.txt" -Append Stop-Process $_ -Force } } } function Add-ToHostsFile ($address, $hostname) { If ((Get-Content $Script:hostsPath) -notcontains "$address $hostname") { Add-Content -Encoding utf8 $Script:hostsPath "$address $hostname" -ErrorAction Stop } } function Remove-FromHostsFile ($hostname) { [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "", Justification="False positive")] $address = $null (Get-Content $Script:hostsPath) | ForEach-Object { $found = $_ -match "^(?<address>.*?) $hostname$" if ($found) { $address = $Matches.address } } | Out-Null if (-not $address) { throw 'Domain not found in hosts file.' } (Get-Content $Script:hostsPath) | Where-Object { $_ -notmatch ".*? $hostname$" } | Out-File $Script:hostsPath -Force -Encoding utf8 -ErrorAction Stop return $address } |