mirror of
https://github.com/fleschutz/PowerShell.git
synced 2025-08-08 20:54:38 +02:00
Renamed folder Scripts to scripts
This commit is contained in:
49
scripts/Windefender.ps1
Executable file
49
scripts/Windefender.ps1
Executable file
@ -0,0 +1,49 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Windows defender in powershell
|
||||
.DESCRIPTION
|
||||
This script can enable disable and show windows defender real time monitoring!
|
||||
.EXAMPLE
|
||||
PS> ./Windefender.ps1
|
||||
.LINK
|
||||
https://github.com/pakoti/Awesome_Sysadmin
|
||||
.NOTES
|
||||
Author: Dark Master | License: CC0-1,0
|
||||
#>
|
||||
|
||||
|
||||
|
||||
$defender = Get-MpPreference
|
||||
|
||||
$userInput = Read-Host "Enter an option:
|
||||
[1] Disable real time monitoring
|
||||
[2] Enable real time monitoring
|
||||
[3] Check status
|
||||
"
|
||||
|
||||
switch($userInput) {
|
||||
1 {
|
||||
$defender.DisableRealtimeMonitoring = $true
|
||||
$defender | Set-MpPreference
|
||||
Write-Host "Real-time monitoring of Windows Defender has been disabled."
|
||||
break
|
||||
}
|
||||
2 {
|
||||
$defender.DisableRealtimeMonitoring = $false
|
||||
$defender | Set-MpPreference
|
||||
Write-Host "Real-time monitoring of Windows Defender has been enabled."
|
||||
break
|
||||
}
|
||||
3 {
|
||||
if($defender.DisableRealtimeMonitoring) {
|
||||
Write-Host "Real-time monitoring of Windows Defender is currently disabled."
|
||||
} else {
|
||||
Write-Host "Real-time monitoring of Windows Defender is currently enabled."
|
||||
}
|
||||
break
|
||||
}
|
||||
default {
|
||||
Write-Host "Invalid option selected."
|
||||
break
|
||||
}
|
||||
}
|
54
scripts/add-firewall-rules.ps1
Executable file
54
scripts/add-firewall-rules.ps1
Executable file
@ -0,0 +1,54 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Adds firewall rules for executables (needs admin rights).
|
||||
.DESCRIPTION
|
||||
This PowerShell script adds firewall rules for the given executable. Administrator rights are required.
|
||||
.PARAMETER PathToExecutables
|
||||
Specifies the path to the executables.
|
||||
.PARAMETER Direction
|
||||
Specifies the direction for the firewall rule. Can be 'Inbound' or 'Outbound'. Default is 'Inbound'.
|
||||
.PARAMETER Profile
|
||||
Specifies the firewall profile. Can be 'Domain', 'Private', or 'Public'. Multiple values can be specified as an array.
|
||||
.EXAMPLE
|
||||
PS> ./add-firewall-rules.ps1 -PathToExecutables C:\MyApp\bin -Direction Outbound -Profile Private
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
#Requires -RunAsAdministrator
|
||||
|
||||
param(
|
||||
[string]$PathToExecutables = "",
|
||||
[string]$Direction = "Inbound",
|
||||
[array]$FirewallProfile = @("Domain", "Private")
|
||||
)
|
||||
|
||||
try {
|
||||
if (-not $PathToExecutables) {
|
||||
$PathToExecutables = Read-Host "Enter path to executables"
|
||||
}
|
||||
|
||||
$AbsPath = Convert-Path -Path $PathToExecutables
|
||||
$Executables = Get-ChildItem -Path $AbsPath -Filter "*.exe"
|
||||
|
||||
if (-not $Executables) {
|
||||
Write-Warning "No executables found. No Firewall rules have been created."
|
||||
Read-Host "Press Enter to continue..."
|
||||
return
|
||||
}
|
||||
|
||||
foreach ($exe in $Executables) {
|
||||
$exeName = $exe.Name
|
||||
$exeFullPath = $exe.FullName
|
||||
|
||||
Write-Output "Adding firewall rule for $exeName"
|
||||
New-NetFirewallRule -DisplayName $exeName -Direction $Direction -Program $exeFullPath -Profile $FirewallProfile -Action Allow
|
||||
}
|
||||
|
||||
Write-Host -ForegroundColor Green "Done"
|
||||
} catch {
|
||||
Write-Error "Error in line $($_.InvocationInfo.ScriptLineNumber): $($_.Exception.Message)"
|
||||
}
|
||||
|
36
scripts/add-memo.ps1
Executable file
36
scripts/add-memo.ps1
Executable file
@ -0,0 +1,36 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Adds a memo text
|
||||
.DESCRIPTION
|
||||
This PowerShell script saves the given memo text to Memos.csv in your home folder.
|
||||
.PARAMETER text
|
||||
Specifies the text to memorize
|
||||
.EXAMPLE
|
||||
PS> ./add-memo.ps1 "Buy apples"
|
||||
✔️ saved to 📄/home/markus/Memos.csv
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$text = "")
|
||||
|
||||
try {
|
||||
if ($text -eq "" ) { $text = Read-Host "Enter the text to memorize" }
|
||||
|
||||
$Path = "~/Memos.csv"
|
||||
$Time = Get-Date -format FileDateTimeUniversal
|
||||
$Line = "$Time,$text"
|
||||
|
||||
if (-not(Test-Path "$Path" -pathType leaf)) {
|
||||
Write-Output "TIME,TEXT" > "$Path"
|
||||
}
|
||||
Write-Output $Line >> "$Path"
|
||||
|
||||
"✔️ saved to 📄$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
29
scripts/alert.ps1
Executable file
29
scripts/alert.ps1
Executable file
@ -0,0 +1,29 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Handles and escalates an alert
|
||||
.DESCRIPTION
|
||||
This PowerShell script handles and escalates the given alert message.
|
||||
.PARAMETER message
|
||||
Specifies the alert message
|
||||
.EXAMPLE
|
||||
PS> ./alert.ps1 "Harddisk failure"
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$Message = "")
|
||||
|
||||
try {
|
||||
if ($Message -eq "" ) { $URL = read-host "Enter alert message" }
|
||||
|
||||
echo "ALERT: $Message"
|
||||
|
||||
curl --header "Access-Token: o.PZl5XCp6SBl4F5PpaNXGDfFpUJZKAlEb" --header "Content-Type: application/json" --data-binary '{"type": "note", "title": "ALERT", "body": "$Message"}' --request POST https://api.pushbullet.com/v2/pushes
|
||||
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
147
scripts/build-repo.ps1
Executable file
147
scripts/build-repo.ps1
Executable file
@ -0,0 +1,147 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Builds a repository
|
||||
.DESCRIPTION
|
||||
This PowerShell script builds a Git repository by supporting build systems such as: autogen, cmake, configure, Gradle, Imakefile, Makefile, and Meson.
|
||||
.PARAMETER path
|
||||
Specifies the path to the Git repository (current working dir by default)
|
||||
.EXAMPLE
|
||||
PS> ./build-repo.ps1 C:\Repos\ninja
|
||||
⏳ Building 📂ninja using CMakeLists.txt into 📂ninja/_My_Build...
|
||||
...
|
||||
✔️ Built 📂ninja in 47 sec
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$path = "$PWD")
|
||||
|
||||
function BuildInDir([string]$path) {
|
||||
$dirName = (Get-Item "$path").Name
|
||||
if (Test-Path "$path/CMakeLists.txt" -pathType leaf) {
|
||||
"⏳ (1/4) Building 📂$dirName by using CMake into 📂$dirName/_My_Build..."
|
||||
if (-not(Test-Path "$path/_My_Build/" -pathType container)) {
|
||||
& mkdir "$path/_My_Build/"
|
||||
}
|
||||
Set-Location "$path/_My_Build/"
|
||||
|
||||
"⏳ (2/4) Executing 'cmake' to generate the Makefile..."
|
||||
& cmake ..
|
||||
if ($lastExitCode -ne "0") { throw "Executing 'cmake ..' has failed" }
|
||||
|
||||
"⏳ (3/4) Executing 'make -j4' to compile and link..."
|
||||
& make -j4
|
||||
if ($lastExitCode -ne "0") { throw "Executing 'make -j4' has failed" }
|
||||
|
||||
"⏳ (4/4) Executing 'make test' to perform tests (optional)..."
|
||||
& make test
|
||||
if ($lastExitCode -ne "0") { throw "Executing 'make test' has failed" }
|
||||
|
||||
} elseif (Test-Path "$path/configure" -pathType leaf) {
|
||||
"⏳ Building 📂$dirName by using 'configure'..."
|
||||
Set-Location "$path/"
|
||||
|
||||
& ./configure
|
||||
#if ($lastExitCode -ne "0") { throw "Script 'configure' exited with error code $lastExitCode" }
|
||||
|
||||
& make -j4
|
||||
if ($lastExitCode -ne "0") { throw "Executing 'make -j4' has failed" }
|
||||
|
||||
& make test
|
||||
if ($lastExitCode -ne "0") { throw "Executing 'make test' has failed" }
|
||||
|
||||
} elseif (Test-Path "$path/autogen.sh" -pathType leaf) {
|
||||
"⏳ Building 📂$dirName by using 'autogen.sh'..."
|
||||
Set-Location "$path/"
|
||||
|
||||
& ./autogen.sh
|
||||
if ($lastExitCode -ne "0") { throw "Script 'autogen.sh' exited with error code $lastExitCode" }
|
||||
|
||||
& make -j4
|
||||
if ($lastExitCode -ne "0") { throw "Executing 'make -j4' has failed" }
|
||||
|
||||
} elseif (Test-Path "$path/build.gradle" -pathType leaf) {
|
||||
"⏳ Building 📂$dirName by using Gradle..."
|
||||
Set-Location "$path"
|
||||
|
||||
& gradle build
|
||||
if ($lastExitCode -ne "0") { throw "'gradle build' has failed" }
|
||||
|
||||
& gradle test
|
||||
if ($lastExitCode -ne "0") { throw "'gradle test' has failed" }
|
||||
|
||||
} elseif (Test-Path "$path/meson.build" -pathType leaf) {
|
||||
"⏳ Building 📂$dirName by using Meson..."
|
||||
Set-Location "$path"
|
||||
& meson . build --prefix=/usr/local
|
||||
if ($lastExitCode -ne "0") { throw "'meson . build' has failed" }
|
||||
|
||||
} elseif (Test-Path "$path/Imakefile" -pathType leaf) {
|
||||
"⏳ Building 📂$dirName by using Imakefile..."
|
||||
Set-Location "$path/"
|
||||
|
||||
& xmkmf
|
||||
if ($lastExitCode -ne "0") { throw "Executing 'xmkmf' has failed" }
|
||||
|
||||
& make -j4
|
||||
if ($lastExitCode -ne "0") { throw "Executing 'make -j4' has failed" }
|
||||
|
||||
} elseif (Test-Path "$path/Makefile" -pathType leaf) {
|
||||
"⏳ Building 📂$dirName by using Makefile..."
|
||||
Set-Location "$path"
|
||||
|
||||
& make -j4
|
||||
if ($lastExitCode -ne "0") { throw "Executing 'make -j4' has failed" }
|
||||
|
||||
} elseif (Test-Path "$path/makefile" -pathType leaf) {
|
||||
"⏳ Building 📂$dirName by using makefile..."
|
||||
Set-Location "$path"
|
||||
|
||||
& make -j4
|
||||
if ($lastExitCode -ne "0") { throw "Executing 'make -j4' has failed" }
|
||||
|
||||
} elseif (Test-Path "$path/compile.sh" -pathType leaf) {
|
||||
"⏳ Building 📂$dirName by using 'compile.sh'..."
|
||||
Set-Location "$path/"
|
||||
|
||||
& ./compile.sh
|
||||
if ($lastExitCode -ne "0") { throw "Script 'compile.sh' exited with error code $lastExitCode" }
|
||||
|
||||
& make -j4
|
||||
if ($lastExitCode -ne "0") { throw "Executing 'make -j4' has failed" }
|
||||
|
||||
} elseif (Test-Path "$path/attower/src/build/DevBuild/build.bat" -pathType leaf) {
|
||||
"⏳ Building 📂$dirName by using build.bat ..."
|
||||
Set-Location "$path/attower/src/build/DevBuild/"
|
||||
|
||||
& ./build.bat build-all-release
|
||||
if ($lastExitCode -ne "0") { throw "Script 'build.bat' exited with error code $lastExitCode" }
|
||||
|
||||
} elseif (Test-Path "$path/$dirName" -pathType container) {
|
||||
"⏳ No make rule found, trying subfolder 📂$($dirName)..."
|
||||
BuildInDir "$path/$dirName"
|
||||
} else {
|
||||
Write-Warning "Sorry, no make rule applies to: 📂$dirName"
|
||||
exit 0 # success
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
$stopWatch = [system.diagnostics.stopwatch]::startNew()
|
||||
|
||||
if (-not(Test-Path "$path" -pathType container)) { throw "Can't access directory: $path" }
|
||||
|
||||
$previousPath = Get-Location
|
||||
BuildInDir "$path"
|
||||
Set-Location "$previousPath"
|
||||
|
||||
$repoDirName = (Get-Item "$path").Name
|
||||
[int]$elapsed = $stopWatch.Elapsed.TotalSeconds
|
||||
"✔️ Built 📂$repoDirName in $elapsed sec"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
40
scripts/build-repos.ps1
Executable file
40
scripts/build-repos.ps1
Executable file
@ -0,0 +1,40 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Builds Git repositories
|
||||
.DESCRIPTION
|
||||
This PowerShell script builds all Git repositories in a folder.
|
||||
.PARAMETER ParentDir
|
||||
Specifies the path to the parent folder
|
||||
.EXAMPLE
|
||||
PS> ./build-repos.ps1 C:\MyRepos
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$ParentDir = "$PWD")
|
||||
|
||||
try {
|
||||
$StopWatch = [system.diagnostics.stopwatch]::startNew()
|
||||
|
||||
$ParentDirName = (Get-Item "$ParentDir").Name
|
||||
"⏳ Step 1 - Checking parent folder 📂$ParentDirName..."
|
||||
if (-not(Test-Path "$ParentDir" -pathType container)) { throw "Can't access folder: $ParentDir" }
|
||||
$Folders = (Get-ChildItem "$ParentDir" -attributes Directory)
|
||||
$FolderCount = $Folders.Count
|
||||
"Found $FolderCount subfolders."
|
||||
|
||||
[int]$Step = 1
|
||||
foreach ($Folder in $Folders) {
|
||||
& "$PSScriptRoot/build-repo.ps1" "$Folder"
|
||||
$Step++
|
||||
}
|
||||
|
||||
[int]$Elapsed = $StopWatch.Elapsed.TotalSeconds
|
||||
"✔️ built $FolderCount Git repositories at 📂$ParentDirName in $Elapsed sec"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
26
scripts/cd-autostart.ps1
Executable file
26
scripts/cd-autostart.ps1
Executable file
@ -0,0 +1,26 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's autostart folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's autostart folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-autostart.ps1
|
||||
📂C:\Users\Markus\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Path = Resolve-Path "$HOME/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup"
|
||||
if (-not(Test-Path "$Path" -pathType container)) {
|
||||
throw "Autostart folder at 📂$Path doesn't exist (yet)"
|
||||
}
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
29
scripts/cd-crashdumps.ps1
Executable file
29
scripts/cd-crashdumps.ps1
Executable file
@ -0,0 +1,29 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Change to the crash dumps folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the crash dumps directory (Windows only). Whenever a software crashes and crash dumps are enabled(!) a crash dump file is written. This file helps to identify the reason for the crash.
|
||||
.EXAMPLE
|
||||
PS> ./cd-crashdumps
|
||||
📂C:\Users\Markus\AppData\Local\CrashDumps
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) { throw "Sorry, Windows only" }
|
||||
|
||||
[string]$path = Resolve-Path -Path "~"
|
||||
if (!(Test-Path "$path" -pathType container)) { throw "Home directory at $path doesn't exist (yet)" }
|
||||
|
||||
$path += "\AppData\Local\CrashDumps"
|
||||
if (!(Test-Path "$path" -pathType container)) { throw "Crashdumps directory at $path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
30
scripts/cd-desktop.ps1
Executable file
30
scripts/cd-desktop.ps1
Executable file
@ -0,0 +1,30 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's desktop folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's desktop folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-desktop
|
||||
📂/home/Markus/Desktop
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
$Path = Resolve-Path "~/Desktop"
|
||||
} else {
|
||||
$Path = [Environment]::GetFolderPath('DesktopDirectory')
|
||||
}
|
||||
if (Test-Path "$Path" -pathType container) {
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
}
|
||||
throw "User's desktop folder at 📂$Path doesn't exist (yet)"
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
30
scripts/cd-docs.ps1
Executable file
30
scripts/cd-docs.ps1
Executable file
@ -0,0 +1,30 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the documents folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the documents folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-docs
|
||||
📂C:\Users\Markus\Documents
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
$Path = Resolve-Path "$HOME/Documents"
|
||||
} else {
|
||||
$Path = [Environment]::GetFolderPath('MyDocuments')
|
||||
}
|
||||
if (-not(Test-Path "$Path" -pathType container)) {
|
||||
throw "Documents folder at 📂$Path doesn't exist (yet)"
|
||||
}
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
30
scripts/cd-downloads.ps1
Executable file
30
scripts/cd-downloads.ps1
Executable file
@ -0,0 +1,30 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's downloads folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's downloads folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-downloads
|
||||
📂C:\Users\Markus\Downloads
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
$Path = Resolve-Path "~/Downloads"
|
||||
} else {
|
||||
$Path = (New-Object -ComObject Shell.Application).NameSpace('shell:Downloads').Self.Path
|
||||
}
|
||||
if (Test-Path "$Path" -pathType container) {
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
}
|
||||
throw "User's downloads folder at 📂$Path doesn't exist (yet)"
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
26
scripts/cd-dropbox.ps1
Executable file
26
scripts/cd-dropbox.ps1
Executable file
@ -0,0 +1,26 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's Dropbox folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's Dropbox folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-dropbox
|
||||
📂C:\Users\Markus\Dropbox
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Path = Resolve-Path "$HOME/Dropbox"
|
||||
if (-not(Test-Path "$Path" -pathType container)) {
|
||||
throw "Dropbox folder at 📂$Path doesn't exist (yet)"
|
||||
}
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
30
scripts/cd-etc.ps1
Executable file
30
scripts/cd-etc.ps1
Executable file
@ -0,0 +1,30 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Changes to the /etc directory
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the /etc directory.
|
||||
.EXAMPLE
|
||||
PS> ./cd-etc
|
||||
📂C:\Windows\System32\drivers\etc
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinx) {
|
||||
$Path = "/etc"
|
||||
} else {
|
||||
$Path = Resolve-Path "$env:WINDIR\System32\drivers\etc"
|
||||
}
|
||||
if (-not(Test-Path "$Path" -pathType container)) {
|
||||
throw "/etc directory at 📂$Path doesn't exist (yet)"
|
||||
}
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
26
scripts/cd-fonts.ps1
Executable file
26
scripts/cd-fonts.ps1
Executable file
@ -0,0 +1,26 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the fonts folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the fonts folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-fonts
|
||||
📂C:\Windows\Fonts
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Path = [Environment]::GetFolderPath('Fonts')
|
||||
if (-not(Test-Path "$Path" -pathType container)) {
|
||||
throw "Fonts folder at 📂$Path doesn't exist (yet)"
|
||||
}
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
26
scripts/cd-home.ps1
Executable file
26
scripts/cd-home.ps1
Executable file
@ -0,0 +1,26 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's home folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's home directory.
|
||||
.EXAMPLE
|
||||
PS> ./cd-home
|
||||
📂C:\Users\Markus
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Path = Resolve-Path -Path "~"
|
||||
if (Test-Path "$Path" -pathType container) {
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
}
|
||||
throw "User's home folder at 📂$Path doesn't exist (yet)"
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
29
scripts/cd-logs.ps1
Executable file
29
scripts/cd-logs.ps1
Executable file
@ -0,0 +1,29 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the logs folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the current working directory to the logs directory.
|
||||
.EXAMPLE
|
||||
PS> ./cd-logs
|
||||
📂/var/logs
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function GetLogsDir {
|
||||
if ($IsLinux) { return "/var/logs" }
|
||||
$WinDir = [System.Environment]::GetFolderPath('Windows')
|
||||
return "$WinDir\Logs"
|
||||
}
|
||||
|
||||
try {
|
||||
$Path = GetLogsDir
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
30
scripts/cd-music.ps1
Executable file
30
scripts/cd-music.ps1
Executable file
@ -0,0 +1,30 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's music folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's music folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-music
|
||||
📂C:\Users\Markus\Music
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
$Path = Resolve-Path "~/Music"
|
||||
} else {
|
||||
$Path = [Environment]::GetFolderPath('MyMusic')
|
||||
}
|
||||
if (Test-Path "$Path" -pathType container) {
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
}
|
||||
throw "User's music folder at 📂$Path doesn't exist (yet)"
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
26
scripts/cd-onedrive.ps1
Executable file
26
scripts/cd-onedrive.ps1
Executable file
@ -0,0 +1,26 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's OneDrive folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's OneDrive folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-onedrive
|
||||
📂C:\Users\Markus\OneDrive
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Path = Resolve-Path "$HOME/OneDrive"
|
||||
if (-not(Test-Path "$Path" -pathType container)) {
|
||||
throw "OneDrive folder at 📂$Path doesn't exist (yet)"
|
||||
}
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
28
scripts/cd-pics.ps1
Executable file
28
scripts/cd-pics.ps1
Executable file
@ -0,0 +1,28 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's pictures folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's pictures folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-pics
|
||||
📂C:\Users\Markus\Pictures
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
$Path = Resolve-Path "$HOME/Pictures"
|
||||
} else {
|
||||
$Path = [Environment]::GetFolderPath('MyPictures')
|
||||
}
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Pictures folder at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
28
scripts/cd-public.ps1
Executable file
28
scripts/cd-public.ps1
Executable file
@ -0,0 +1,28 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the Public folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the Public folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-public
|
||||
📂C:\Users\Public
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
$Path = Resolve-Path "~/Public"
|
||||
} else {
|
||||
$Path = Resolve-Path "~/../Public"
|
||||
}
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Public folder at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
34
scripts/cd-recycle-bin.ps1
Executable file
34
scripts/cd-recycle-bin.ps1
Executable file
@ -0,0 +1,34 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's recycle bin folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's recycle bin folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-recycle-bin
|
||||
📂C:\$Recycle.Bin\S-1-5-21-123404-23309-294260-1001
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function GetCurrentUserSID { [CmdletBinding()] param()
|
||||
Add-Type -AssemblyName System.DirectoryServices.AccountManagement
|
||||
return ([System.DirectoryServices.AccountManagement.UserPrincipal]::Current).SID.Value
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
$Path = "$HOME/.local/share/Trash/"
|
||||
} else {
|
||||
$Path = "C:\$Recycle.Bin\" + "$(GetCurrentUserSID)"
|
||||
}
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Recycle bin folder at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
37
scripts/cd-repos.ps1
Executable file
37
scripts/cd-repos.ps1
Executable file
@ -0,0 +1,37 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's repos folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's Git repositories folder.
|
||||
.PARAMETER Subpath
|
||||
Specifies an additional relative subpath (optional)
|
||||
.EXAMPLE
|
||||
PS> ./cd-repos
|
||||
📂C:\Users\Markus\source\Repos
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$Subpath = "")
|
||||
|
||||
try {
|
||||
if (Test-Path "$HOME/Repos" -pathType Container) { # try short name
|
||||
$Path = "$HOME/Repos/$Subpath"
|
||||
} elseif (Test-Path "$HOME/Repositories" -pathType Container) { # try long name
|
||||
$Path = "$HOME/Repositories/$Subpath"
|
||||
} elseif (Test-Path "$HOME/source/repos" -pathType Container) { # try Visual Studio default
|
||||
$Path = "$HOME/source/repos/$Subpath"
|
||||
} else {
|
||||
throw "The folder for Git repositories in your home directory doesn't exist (yet)."
|
||||
}
|
||||
if (-not(Test-Path "$Path" -pathType Container)) { throw "The path to 📂$Path doesn't exist (yet)." }
|
||||
$Path = Resolve-Path "$Path"
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error: $($Error[0])"
|
||||
exit 1
|
||||
}
|
23
scripts/cd-root.ps1
Executable file
23
scripts/cd-root.ps1
Executable file
@ -0,0 +1,23 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the root directory
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the current working directory to the root directory (C:\ on Windows).
|
||||
.EXAMPLE
|
||||
PS> ./cd-root
|
||||
📂C:\
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) { $Path = "/" } else { $Path = "C:\" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
36
scripts/cd-screenshots.ps1
Executable file
36
scripts/cd-screenshots.ps1
Executable file
@ -0,0 +1,36 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's screenshots folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's screenshots folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-screenshots
|
||||
📂C:\Users\Markus\Pictures\Screenshots
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function GetScreenshotsFolder {
|
||||
if ($IsLinux) {
|
||||
$Path = "$HOME/Pictures"
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Pictures folder at $Path doesn't exist (yet)" }
|
||||
if (Test-Path "$Path/Screenshots" -pathType container) { $Path = "$Path/Screenshots" }
|
||||
} else {
|
||||
$Path = [Environment]::GetFolderPath('MyPictures')
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Pictures folder at $Path doesn't exist (yet)" }
|
||||
if (Test-Path "$Path\Screenshots" -pathType container) { $Path = "$Path\Screenshots" }
|
||||
}
|
||||
return $Path
|
||||
}
|
||||
|
||||
try {
|
||||
$Path = GetScreenshotsFolder
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
24
scripts/cd-scripts.ps1
Executable file
24
scripts/cd-scripts.ps1
Executable file
@ -0,0 +1,24 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the PowerShell scripts folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the PowerShell scripts folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-scripts
|
||||
📂C:\Users\Markus\source\repos\PowerShell\scripts
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Path = Resolve-Path "$PSScriptRoot"
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "PowerShell scripts folder at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
24
scripts/cd-ssh.ps1
Executable file
24
scripts/cd-ssh.ps1
Executable file
@ -0,0 +1,24 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's SSH folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's SSH folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-ssh
|
||||
📂C:\Users\Markus\.ssh
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Path = Resolve-Path "~/.ssh"
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "User's SSH folder at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
31
scripts/cd-temp.ps1
Executable file
31
scripts/cd-temp.ps1
Executable file
@ -0,0 +1,31 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the temporary folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the temporary folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-temp
|
||||
📂C:\Users\Markus\AppData\Local\Temp
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function GetTempDir {
|
||||
if ("$env:TEMP" -ne "") { return "$env:TEMP" }
|
||||
if ("$env:TMP" -ne "") { return "$env:TMP" }
|
||||
if ($IsLinux) { return "/tmp" }
|
||||
return "C:\Temp"
|
||||
}
|
||||
|
||||
try {
|
||||
$Path = GetTempDir
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Temporary folder at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
28
scripts/cd-templates.ps1
Executable file
28
scripts/cd-templates.ps1
Executable file
@ -0,0 +1,28 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the templates folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the templates folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-templates
|
||||
📂/home/Markus/Templates
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
$Path = Resolve-Path "~/Templates"
|
||||
} else {
|
||||
$Path = [Environment]::GetFolderPath('Templates')
|
||||
}
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Templates folder at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
34
scripts/cd-trash.ps1
Executable file
34
scripts/cd-trash.ps1
Executable file
@ -0,0 +1,34 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's trash folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's trash folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-trash
|
||||
📂C:\$Recycle.Bin\S-1-5-21-123404-23309-294260-1001
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function GetCurrentUserSID { [CmdletBinding()] param()
|
||||
Add-Type -AssemblyName System.DirectoryServices.AccountManagement
|
||||
return ([System.DirectoryServices.AccountManagement.UserPrincipal]::Current).SID.Value
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
$Path = "$HOME/.local/share/Trash/"
|
||||
} else {
|
||||
$Path = "C:\$Recycle.Bin\" + "$(GetCurrentUserSID)"
|
||||
}
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Trash folder at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
24
scripts/cd-up.ps1
Executable file
24
scripts/cd-up.ps1
Executable file
@ -0,0 +1,24 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to one level up
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to one directory level up.
|
||||
.EXAMPLE
|
||||
PS> .\cd-up
|
||||
📂C:\Users
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Path = Resolve-Path ".."
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Folder at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
24
scripts/cd-up2.ps1
Executable file
24
scripts/cd-up2.ps1
Executable file
@ -0,0 +1,24 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to two directory levels up
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to two directory level up.
|
||||
.EXAMPLE
|
||||
PS> ./cd-up2
|
||||
📂C:\
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Path = Resolve-Path "../.."
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Folder at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
24
scripts/cd-up3.ps1
Executable file
24
scripts/cd-up3.ps1
Executable file
@ -0,0 +1,24 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to three directory levels up
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to three directory levels up.
|
||||
.EXAMPLE
|
||||
PS> ./cd-up3
|
||||
📂C:\
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Path = Resolve-Path "../../.."
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Folder at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
24
scripts/cd-up4.ps1
Executable file
24
scripts/cd-up4.ps1
Executable file
@ -0,0 +1,24 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to four directory levels up
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to four directory levels up.
|
||||
.EXAMPLE
|
||||
PS> ./cd-up4
|
||||
📂C:\
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Path = Resolve-Path "../../../.."
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Folder at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
24
scripts/cd-users.ps1
Executable file
24
scripts/cd-users.ps1
Executable file
@ -0,0 +1,24 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the users directory
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the users directory.
|
||||
.EXAMPLE
|
||||
PS> ./cd-users
|
||||
📂C:\Users
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Path = Resolve-Path "$HOME/.."
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Users directory at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
28
scripts/cd-videos.ps1
Executable file
28
scripts/cd-videos.ps1
Executable file
@ -0,0 +1,28 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the user's videos folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the user's videos folder.
|
||||
.EXAMPLE
|
||||
PS> ./cd-videos
|
||||
📂C:\Users\Markus\Videos
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
$Path = Resolve-Path "$HOME/Videos"
|
||||
} else {
|
||||
$Path = [Environment]::GetFolderPath('MyVideos')
|
||||
}
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Videos folder at 📂$Path doesn't exist (yet)" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
24
scripts/cd-windows.ps1
Executable file
24
scripts/cd-windows.ps1
Executable file
@ -0,0 +1,24 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Sets the working directory to the Windows directory
|
||||
.DESCRIPTION
|
||||
This PowerShell script changes the working directory to the Windows directory.
|
||||
.EXAMPLE
|
||||
PS> ./cd-windows
|
||||
📂C:\Windows
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Path = Resolve-Path "$env:WINDIR"
|
||||
if (-not(Test-Path "$Path" -pathType container)) { throw "Windows directory at 📂$Path doesn't exist" }
|
||||
Set-Location "$Path"
|
||||
"📂$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
37
scripts/change-wallpaper.ps1
Executable file
37
scripts/change-wallpaper.ps1
Executable file
@ -0,0 +1,37 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Changes the wallpaper
|
||||
.DESCRIPTION
|
||||
This PowerShell script downloads a random photo from Unsplash and sets it as desktop background.
|
||||
.PARAMETER Category
|
||||
Specifies the photo category (beach, city, ...)
|
||||
.EXAMPLE
|
||||
PS> ./change-wallpaper
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$Category = "")
|
||||
|
||||
function GetTempDir {
|
||||
if ("$env:TEMP" -ne "") { return "$env:TEMP" }
|
||||
if ("$env:TMP" -ne "") { return "$env:TMP" }
|
||||
if ($IsLinux) { return "/tmp" }
|
||||
return "C:\Temp"
|
||||
}
|
||||
|
||||
try {
|
||||
& "$PSScriptRoot/speak-english.ps1" "Just a second..."
|
||||
|
||||
$Path = "$(GetTempDir)/next_wallpaper.jpg"
|
||||
& wget -O $Path "https://source.unsplash.com/3840x2160?$Category"
|
||||
if ($lastExitCode -ne "0") { throw "Download failed" }
|
||||
|
||||
& "$PSScriptRoot/set-wallpaper.ps1" -ImageFile "$Path"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
33
scripts/check-admin.ps1
Executable file
33
scripts/check-admin.ps1
Executable file
@ -0,0 +1,33 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Check for admin rights
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks if the user has administrator rights.
|
||||
.EXAMPLE
|
||||
PS> ./check-admin.ps1
|
||||
✅ Yes
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
# todo
|
||||
} else {
|
||||
$user = [Security.Principal.WindowsIdentity]::GetCurrent()
|
||||
$principal = (New-Object Security.Principal.WindowsPrincipal $user)
|
||||
if ($principal.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)) {
|
||||
"✅ Yes"
|
||||
} elseif ($principal.IsInRole([Security.Principal.WindowsBuiltinRole]::Guest)) {
|
||||
"⚠️ No, guest rights only"
|
||||
} else {
|
||||
"⚠️ No, normal user rights only"
|
||||
}
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
41
scripts/check-apps.ps1
Executable file
41
scripts/check-apps.ps1
Executable file
@ -0,0 +1,41 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Query the app status
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the installed applications and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-apps.ps1
|
||||
✅ 119 Windows apps installed, 11 upgrades available
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
Write-Progress "Querying installed applications..."
|
||||
$numPkgs = (apt list --installed 2>/dev/null).Count
|
||||
$numSnaps = (snap list).Count - 1
|
||||
Write-Progress -Completed "."
|
||||
Write-Host "✅ $numPkgs Debian packages, $numSnaps snaps installed"
|
||||
} else {
|
||||
Write-Progress "Querying installed applications..."
|
||||
$Apps = Get-AppxPackage
|
||||
Write-Progress -Completed "."
|
||||
Write-Host "✅ $($Apps.Count) Windows apps installed, " -noNewline
|
||||
|
||||
[int]$NumNonOk = 0
|
||||
foreach($App in $Apps) { if ($App.Status -ne "Ok") { $NumNonOk++ } }
|
||||
if ($NumNonOk -gt 0) { $Status += ", $NumNonOk non-ok" }
|
||||
[int]$NumErrors = (Get-AppxLastError)
|
||||
if ($NumErrors -gt 0) { $Status += ", $NumErrors errors" }
|
||||
|
||||
$NumUpdates = (winget upgrade --include-unknown).Count - 5
|
||||
Write-Host "$NumUpdates upgrades available"
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
42
scripts/check-bios.ps1
Executable file
42
scripts/check-bios.ps1
Executable file
@ -0,0 +1,42 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the BIOS status
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the BIOS status and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-bios.ps1
|
||||
✅ BIOS model P62 v02.67 by HP (version HPQOEM - 5, S/N CZC1080B01)
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
Write-Progress "Querying BIOS details..."
|
||||
$model = (sudo dmidecode -s system-product-name)
|
||||
if ("$model" -ne "") {
|
||||
$version = (sudo dmidecode -s bios-version)
|
||||
$releaseDate = (sudo dmidecode -s bios-release-date)
|
||||
$manufacturer = (sudo dmidecode -s system-manufacturer)
|
||||
Write-Host "✅ BIOS model $model by $manufacturer (version $version of $releaseDate)"
|
||||
}
|
||||
Write-Progress -completed "."
|
||||
} else {
|
||||
$BIOS = Get-CimInstance -ClassName Win32_BIOS
|
||||
$model = $BIOS.Name.Trim()
|
||||
$version = $BIOS.Version.Trim()
|
||||
$serialNumber = $BIOS.SerialNumber.Trim()
|
||||
$manufacturer = $BIOS.Manufacturer.Trim()
|
||||
if ($serialNumber -eq "To be filled by O.E.M.") {
|
||||
Write-Host "✅ BIOS model $model by $manufacturer (version $version)"
|
||||
} else {
|
||||
Write-Host "✅ BIOS model $model by $manufacturer (version $version, S/N $serialNumber)"
|
||||
}
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
84
scripts/check-cpu.ps1
Executable file
84
scripts/check-cpu.ps1
Executable file
@ -0,0 +1,84 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the CPU status
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the CPU status (name, type, speed, temperature, etc) and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-cpu.ps1
|
||||
✅ Intel(R) Core(TM) i9-10900X CPU @ 3.70GHz (AMD64, 20 cores, CPU0, 3696MHz, CPU0 socket, 31.3°C)
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function GetProcessorTemperature {
|
||||
$temp = 99999.9 # unsupported
|
||||
if ($IsLinux) {
|
||||
if (Test-Path "/sys/class/thermal/thermal_zone0/temp" -pathType leaf) {
|
||||
[int]$IntTemp = Get-Content "/sys/class/thermal/thermal_zone0/temp"
|
||||
$temp = [math]::round($IntTemp / 1000.0, 1)
|
||||
}
|
||||
} else {
|
||||
$objects = Get-WmiObject -Query "SELECT * FROM Win32_PerfFormattedData_Counters_ThermalZoneInformation" -Namespace "root/CIMV2"
|
||||
foreach ($object in $objects) {
|
||||
$highPrec = $object.HighPrecisionTemperature
|
||||
$temp = [math]::round($highPrec / 100.0, 1)
|
||||
}
|
||||
}
|
||||
return $temp
|
||||
}
|
||||
|
||||
function GetProcessorArchitecture {
|
||||
if ("$env:PROCESSOR_ARCHITECTURE" -ne "") { return "$env:PROCESSOR_ARCHITECTURE" }
|
||||
if ($IsLinux) {
|
||||
$Name = $PSVersionTable.OS
|
||||
if ($Name -like "*-generic *") {
|
||||
if ([System.Environment]::Is64BitOperatingSystem) { return "x64" } else { return "x86" }
|
||||
} elseif ($Name -like "*-raspi *") {
|
||||
if ([System.Environment]::Is64BitOperatingSystem) { return "ARM64" } else { return "ARM32" }
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Progress "Querying CPU status... "
|
||||
$status = "✅"
|
||||
$celsius = GetProcessorTemperature
|
||||
if ($celsius -eq 99999.9) {
|
||||
$temp = "no temp"
|
||||
} elseif ($celsius -gt 50) {
|
||||
$temp = "$($celsius)°C"
|
||||
$status = "⚠️"
|
||||
} elseif ($celsius -lt 0) {
|
||||
$temp = "$($celsius)°C"
|
||||
$status = "⚠️"
|
||||
} else {
|
||||
$temp = "$($celsius)°C"
|
||||
}
|
||||
|
||||
$arch = GetProcessorArchitecture
|
||||
if ($IsLinux) {
|
||||
$cpuName = "$arch CPU"
|
||||
$arch = ""
|
||||
$deviceID = ""
|
||||
$speed = ""
|
||||
$socket = ""
|
||||
} else {
|
||||
$details = Get-WmiObject -Class Win32_Processor
|
||||
$cpuName = $details.Name.trim()
|
||||
$arch = "$arch, "
|
||||
$deviceID = "$($details.DeviceID), "
|
||||
$speed = "$($details.MaxClockSpeed)MHz, "
|
||||
$socket = "$($details.SocketDesignation) socket, "
|
||||
}
|
||||
$cores = [System.Environment]::ProcessorCount
|
||||
Write-Progress -completed " "
|
||||
Write-Host "$status $cpuName ($($arch)$cores cores, $($deviceID)$($speed)$($socket)$temp)"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
23
scripts/check-day.ps1
Executable file
23
scripts/check-day.ps1
Executable file
@ -0,0 +1,23 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Determines the current day
|
||||
.DESCRIPTION
|
||||
This PowerShell script determines and speaks the current day by text-to-speech (TTS).
|
||||
.EXAMPLE
|
||||
PS> ./check-day
|
||||
✔️ It's Sunday.
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
[system.threading.thread]::currentthread.currentculture=[system.globalization.cultureinfo]"en-US"
|
||||
$Weekday = (Get-Date -format "dddd")
|
||||
& "$PSScriptRoot/speak-english.ps1" "It's $Weekday."
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
39
scripts/check-dns.ps1
Executable file
39
scripts/check-dns.ps1
Executable file
@ -0,0 +1,39 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Check the DNS resolution
|
||||
.DESCRIPTION
|
||||
This PowerShell script measures the DNS resolution speed (using 100 popular domains) and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-dns.ps1
|
||||
✅ DNS resolves 56.5 domains per second
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
Write-Progress "Measuring DNS resolution..."
|
||||
$table = Import-CSV "$PSScriptRoot/../data/popular-domains.csv"
|
||||
$numRows = $table.Length
|
||||
|
||||
$stopWatch = [system.diagnostics.stopwatch]::startNew()
|
||||
if ($IsLinux) {
|
||||
foreach($row in $table){$nop=dig $row.Domain +short}
|
||||
} else {
|
||||
foreach($row in $table){$nop=Resolve-DNSName $row.Domain}
|
||||
}
|
||||
[float]$elapsed = $stopWatch.Elapsed.TotalSeconds
|
||||
|
||||
Write-Progress -completed " "
|
||||
$average = [math]::round($numRows / $elapsed, 1)
|
||||
if ($average -lt 10.0) {
|
||||
Write-Host "⚠️ DNS resolves $average domains per second only"
|
||||
} else {
|
||||
Write-Host "✅ DNS resolves $average domains per second"
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
39
scripts/check-drive-space.ps1
Executable file
39
scripts/check-drive-space.ps1
Executable file
@ -0,0 +1,39 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks a drive for free space left
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks a drive for free space left (20 GB by default).
|
||||
.PARAMETER Drive
|
||||
Specifies the drive to check
|
||||
.PARAMETER MinLevel
|
||||
Specifies the minimum level in Gigabyte
|
||||
.EXAMPLE
|
||||
PS> ./check-drive-space C
|
||||
✔️ 172 GB left on drive C (61 of 233 GB used)
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$Drive = "", [int]$MinLevel = 20) # minimum level in GB
|
||||
|
||||
try {
|
||||
if ($Drive -eq "" ) { $Drive = read-host "Enter drive to check" }
|
||||
|
||||
$DriveDetails = (get-psdrive $Drive)
|
||||
[int]$Free = (($DriveDetails.Free / 1024) / 1024) / 1024
|
||||
[int]$Used = (($DriveDetails.Used / 1024) / 1024) / 1024
|
||||
[int]$Total = ($Used + $Free)
|
||||
|
||||
if ($Free -lt $MinLevel) {
|
||||
write-warning "Drive $Drive has only $Free GB left to use! ($Used of $Total GB used, minimum is $MinLevel GB)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
& "$PSScriptRoot/speak-english.ps1" "Drive $Drive has $Free GB left ($Total GB total)"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
61
scripts/check-drives.ps1
Executable file
61
scripts/check-drives.ps1
Executable file
@ -0,0 +1,61 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the drive space
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the free space of all drives and prints it.
|
||||
.PARAMETER minLevel
|
||||
Specifies the minimum warning level (10 GB by default)
|
||||
.EXAMPLE
|
||||
PS> ./check-drives.ps1
|
||||
✅ Drive C: uses 49%, 512GB free of 1TB
|
||||
✅ Drive D: uses 84%, 641GB free of 4TB
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([int64]$minLevel = 10) # 10 GB minimum
|
||||
|
||||
function Bytes2String { param([int64]$bytes)
|
||||
if ($bytes -lt 1000) { return "$bytes bytes" }
|
||||
$bytes /= 1000
|
||||
if ($bytes -lt 1000) { return "$($bytes)KB" }
|
||||
$bytes /= 1000
|
||||
if ($bytes -lt 1000) { return "$($bytes)MB" }
|
||||
$bytes /= 1000
|
||||
if ($bytes -lt 1000) { return "$($bytes)GB" }
|
||||
$bytes /= 1000
|
||||
if ($bytes -lt 1000) { return "$($bytes)TB" }
|
||||
$bytes /= 1000
|
||||
return "$($bytes)PB"
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Progress "Querying drives..."
|
||||
$drives = Get-PSDrive -PSProvider FileSystem
|
||||
$minLevel *= 1000 * 1000 * 1000
|
||||
Write-Progress -completed " "
|
||||
foreach($drive in $drives) {
|
||||
$details = (Get-PSDrive $drive.Name)
|
||||
if ($IsLinux) { $name = $drive.Name } else { $name = $drive.Name + ":" }
|
||||
[int64]$free = $details.Free
|
||||
[int64]$used = $details.Used
|
||||
[int64]$total = ($used + $free)
|
||||
|
||||
if ($total -eq 0) {
|
||||
Write-Host "✅ Drive $name is empty"
|
||||
} elseif ($free -eq 0) {
|
||||
Write-Host "⚠️ Drive $name with $(Bytes2String $total) is full"
|
||||
} elseif ($free -lt $minLevel) {
|
||||
Write-Host "⚠️ Drive $name with $(Bytes2String $total) is nearly full, $(Bytes2String $free) free"
|
||||
} else {
|
||||
[int]$percent = ($used * 100) / $total
|
||||
Write-Host "✅ Drive $name uses $percent%, $(Bytes2String $free) free of $(Bytes2String $total)"
|
||||
}
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
44
scripts/check-dusk.ps1
Executable file
44
scripts/check-dusk.ps1
Executable file
@ -0,0 +1,44 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the time of dusk
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the time of dusk and answers by text-to-speech (TTS).
|
||||
.EXAMPLE
|
||||
PS> ./check-dusk.ps1
|
||||
Dusk is in 2 hours at 8 PM.
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function TimeSpanToString { param([TimeSpan]$Delta)
|
||||
$Result = ""
|
||||
if ($Delta.Hours -eq 1) { $Result += "1 hour and "
|
||||
} elseif ($Delta.Hours -gt 1) { $Result += "$($Delta.Hours) hours and "
|
||||
}
|
||||
if ($Delta.Minutes -eq 1) { $Result += "1 minute"
|
||||
} else { $Result += "$($Delta.Minutes) minutes"
|
||||
}
|
||||
return $Result
|
||||
}
|
||||
|
||||
try {
|
||||
[system.threading.thread]::currentThread.currentCulture=[system.globalization.cultureInfo]"en-US"
|
||||
$String = (Invoke-WebRequest http://wttr.in/?format="%d" -UserAgent "curl" -useBasicParsing).Content
|
||||
$Hour,$Minute,$Second = $String -split ':'
|
||||
$Dusk = Get-Date -Hour $Hour -Minute $Minute -Second $Second
|
||||
$Now = [DateTime]::Now
|
||||
if ($Now -lt $Dusk) {
|
||||
$TimeSpan = TimeSpanToString($Dusk - $Now)
|
||||
$Reply = "Dusk is in $TimeSpan at $($Dusk.ToShortTimeString())."
|
||||
} else {
|
||||
$TimeSpan = TimeSpanToString($Now - $Dusk)
|
||||
$Reply = "Dusk was $TimeSpan ago at $($Dusk.ToShortTimeString())."
|
||||
}
|
||||
Write-Output $Reply
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
28
scripts/check-easter-sunday.ps1
Executable file
28
scripts/check-easter-sunday.ps1
Executable file
@ -0,0 +1,28 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the time until Easter Sunday
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the time until Easter Sunday and replies by text-to-speech (TTS).
|
||||
.EXAMPLE
|
||||
PS> ./check-easter-sunday
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Now = [DateTime]::Now
|
||||
$Easter = [Datetime]("04/17/2022")
|
||||
if ($Now -lt $Easter) {
|
||||
$Diff = $Easter – $Now
|
||||
& "$PSScriptRoot/speak-english.ps1" "Easter Sunday on April 17 is in $($Diff.Days) days."
|
||||
} else {
|
||||
$Diff = $Now - $Easter
|
||||
& "$PSScriptRoot/speak-english.ps1" "Easter Sunday on April 17 was $($Diff.Days) days ago."
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
32
scripts/check-file-system.ps1
Executable file
32
scripts/check-file-system.ps1
Executable file
@ -0,0 +1,32 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the file system of a drive (needs admin rights)
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the file system of a drive. It needs admin rights.
|
||||
.PARAMETER Drive
|
||||
Specifies the drive to check
|
||||
.EXAMPLE
|
||||
PS> ./check-file-system C
|
||||
✔️ file system on drive C is clean
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
#Requires -RunAsAdministrator
|
||||
|
||||
param([string]$Drive = "")
|
||||
|
||||
try {
|
||||
if ($Drive -eq "" ) { $Drive = read-host "Enter drive (letter) to check" }
|
||||
|
||||
$Result = repair-volume -driveLetter $Drive -scan
|
||||
if ($Result -ne "NoErrorsFound") { throw "'repair-volume' failed" }
|
||||
|
||||
& "$PSScriptRoot/speak-english.ps1" "File system on drive $Drive is clean."
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
128
scripts/check-file.ps1
Executable file
128
scripts/check-file.ps1
Executable file
@ -0,0 +1,128 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks a file
|
||||
.DESCRIPTION
|
||||
This PowerShell script determines and prints the file type of the given file.
|
||||
.PARAMETER Path
|
||||
Specifies the path to the file
|
||||
.EXAMPLE
|
||||
PS> ./check-file C:\my.exe
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$Path = "")
|
||||
|
||||
|
||||
function Check-Header { param( $path )
|
||||
$path = Resolve-Path $path
|
||||
|
||||
# Hexidecimal signatures for expected files
|
||||
$known = @'
|
||||
"Extension","Header"
|
||||
"3gp","66 74 79 70 33 67"
|
||||
"7z","37 7A BC AF 27 1C"
|
||||
"8sv","38 53 56 58"
|
||||
"8svx","46 4F 52 4D nn nn nn nn"
|
||||
"acbm","46 4F 52 4D nn nn nn nn"
|
||||
"aif","41 49 46 46"
|
||||
"aiff","46 4F 52 4D nn nn nn nn"
|
||||
"anbm","46 4F 52 4D nn nn nn nn"
|
||||
"anim","46 4F 52 4D nn nn nn nn "
|
||||
"asf","30 26 B2 75 8E 66 CF 11"
|
||||
"avi","52 49 46 46 nn nn nn nn "
|
||||
"bac","42 41 43 4B 4D 49 4B 45"
|
||||
"bpg","42 50 47 FB"
|
||||
"cab","4D 53 43 46"
|
||||
"cin","80 2A 5F D7"
|
||||
"class","CA FE BA BE"
|
||||
"cmus","46 4F 52 4D nn nn nn nn"
|
||||
"cr2","49 49 2A 00 10 00 00 00"
|
||||
"crx","43 72 32 34"
|
||||
"cwk","05 07 00 00 42 4F 42 4F"
|
||||
"cwk","06 07 E1 00 42 4F 42 4F"
|
||||
"dat","50 4D 4F 43 43 4D 4F 43"
|
||||
"DBA","BE BA FE CA"
|
||||
"DBA","00 01 42 44"
|
||||
"dex","64 65 78 0A 30 33 35 00"
|
||||
"djvu","41 54 26 54 46 4F 52 4D nn nn nn nn 44 4A 56"
|
||||
"dmg","78 01 73 0D 62 62 60"
|
||||
"doc","D0 CF 11 E0 A1 B1 1A E1"
|
||||
"dpx","53 44 50 58"
|
||||
"exr","76 2F 31 01"
|
||||
"fax","46 41 58 58"
|
||||
"faxx","46 4F 52 4D nn nn nn nn"
|
||||
"fh8","41 47 44 33"
|
||||
"fits","53 49 4D 50 4C 45 20 20"
|
||||
"flac","66 4C 61 43"
|
||||
"flif","46 4C 49 46"
|
||||
"ftxt","46 4F 52 4D nn nn nn nn"
|
||||
"gif","47 49 46 38 37 61"
|
||||
"ico","00 00 01 00"
|
||||
"idx","49 4E 44 58"
|
||||
"iff","41 43 42 4D"
|
||||
"iff","41 4E 42 4D"
|
||||
"iff","41 4E 49 4D"
|
||||
"iff","46 4F 52 4D nn nn nn nn"
|
||||
"ilbm","46 4F 52 4D nn nn nn nn"
|
||||
"iso","43 44 30 30 31"
|
||||
"jpg","FF D8 FF DB"
|
||||
"lbm","49 4C 42 4D"
|
||||
"lz","4C 5A 49 50"
|
||||
"lz4","04 22 4D 18"
|
||||
"mid","4D 54 68 64"
|
||||
"mkv","1A 45 DF A3"
|
||||
"MLV","4D 4C 56 49"
|
||||
"mus","43 4D 55 53"
|
||||
"nes","4E 45 53 1A"
|
||||
"ods","50 4B 05 06"
|
||||
"ogg","4F 67 67 53"
|
||||
"PDB","00 00 00 00 00 00 00 00"
|
||||
"pdf","25 50 44 46"
|
||||
"png","89 50 4E 47 0D 0A 1A 0A"
|
||||
"ps","25 21 50 53"
|
||||
"psd","38 42 50 53"
|
||||
"rar","52 61 72 21 1A 07 00"
|
||||
"rar","52 61 72 21 1A 07 01 00"
|
||||
"smu","53 4D 55 53"
|
||||
"smus","46 4F 52 4D nn nn nn nn"
|
||||
"stg","4D 49 4C 20"
|
||||
"tar","75 73 74 61 72 00 30 30"
|
||||
"TDA","00 01 44 54"
|
||||
"tif","49 49 2A 00"
|
||||
"toast","45 52 02 00 00 00"
|
||||
"tox","74 6F 78 33"
|
||||
"txt","46 54 58 54"
|
||||
"vsdx","50 4B 07 08"
|
||||
"wav","52 49 46 46 nn nn nn nn"
|
||||
"wma","A6 D9 00 AA 00 62 CE 6C"
|
||||
"xar","78 61 72 21"
|
||||
"yuv","59 55 56 4E"
|
||||
"yuvn","46 4F 52 4D nn nn nn nn"
|
||||
"zip","50 4B 03 04"
|
||||
"epub","50 4B 03 04 0A 00 02 00"
|
||||
'@ | ConvertFrom-Csv | sort {$_.header.length} -Descending
|
||||
|
||||
$known | % {$_.header = $_.header -replace '\s'}
|
||||
|
||||
try {
|
||||
# Get content of each file (up to 4 bytes) for analysis
|
||||
$HeaderAsHexString = New-Object System.Text.StringBuilder
|
||||
[Byte[]](Get-Content -Path $path -TotalCount 4 -Encoding Byte -ea Stop) | % {
|
||||
if (("{0:X}" -f $_).length -eq 1) {
|
||||
$null = $HeaderAsHexString.Append('0{0:X}' -f $_)
|
||||
} else {
|
||||
$null = $HeaderAsHexString.Append('{0:X}' -f $_)
|
||||
}
|
||||
}
|
||||
|
||||
# Validate file header
|
||||
# might change .startswith() to -match.
|
||||
# might remove 'select -f 1' to get all possible matching extensions, or just somehow make it a better match.
|
||||
$known | ? {$_.header.startswith($HeaderAsHexString.ToString())} | select -f 1 | % {$_.extension}
|
||||
} catch {}
|
||||
}
|
||||
|
||||
Check-Header $Path
|
31
scripts/check-firewall.ps1
Executable file
31
scripts/check-firewall.ps1
Executable file
@ -0,0 +1,31 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the firewall status
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the status of the firewall and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-firewall.ps1
|
||||
✅ Firewall enabled
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
Write-Host "✅ Firewall " -noNewline
|
||||
& sudo ufw status
|
||||
} else {
|
||||
$enabled = (gp 'HKLM:\SYSTEM\ControlSet001\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile').EnableFirewall
|
||||
if ($enabled) {
|
||||
Write-Host "✅ Firewall enabled"
|
||||
} else {
|
||||
Write-Host "⚠️ Firewall disabled"
|
||||
}
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
46
scripts/check-gpu.ps1
Executable file
46
scripts/check-gpu.ps1
Executable file
@ -0,0 +1,46 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the GPU status
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the GPU status and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-gpu.ps1
|
||||
✅ NVIDIA Quadro P400 GPU (2GB RAM, 3840x2160 pixels, 32-bit, 59Hz, driver 31.0.15.1740, status OK)
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function Bytes2String { param([int64]$Bytes)
|
||||
if ($Bytes -lt 1000) { return "$Bytes bytes" }
|
||||
$Bytes /= 1000
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)KB" }
|
||||
$Bytes /= 1000
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)MB" }
|
||||
$Bytes /= 1000
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)GB" }
|
||||
$Bytes /= 1000
|
||||
return "$($Bytes)TB"
|
||||
}
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
# TODO
|
||||
} else {
|
||||
$Details = Get-WmiObject Win32_VideoController
|
||||
$Model = $Details.Caption
|
||||
$RAMSize = $Details.AdapterRAM
|
||||
$ResWidth = $Details.CurrentHorizontalResolution
|
||||
$ResHeight = $Details.CurrentVerticalResolution
|
||||
$BitsPerPixel = $Details.CurrentBitsPerPixel
|
||||
$RefreshRate = $Details.CurrentRefreshRate
|
||||
$DriverVersion = $Details.DriverVersion
|
||||
$Status = $Details.Status
|
||||
Write-Host "✅ $Model GPU ($(Bytes2String $RAMSize) RAM, $($ResWidth)x$($ResHeight) pixels, $($BitsPerPixel)-bit, $($RefreshRate)Hz, driver $DriverVersion, status $Status)"
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
26
scripts/check-hardware.ps1
Executable file
26
scripts/check-hardware.ps1
Executable file
@ -0,0 +1,26 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the hardware
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the hardware details of the local computer and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-hardware.ps1
|
||||
|
||||
H A R D W A R E
|
||||
✅ Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz (CPU0, 2701MHz, socket U3E1, 30.1°C)
|
||||
...
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
" "
|
||||
& "$PSScriptRoot/write-green.ps1" " H A R D W A R E"
|
||||
& "$PSScriptRoot/check-cpu.ps1"
|
||||
& "$PSScriptRoot/check-ram.ps1"
|
||||
& "$PSScriptRoot/check-gpu.ps1"
|
||||
& "$PSScriptRoot/check-smart-devices.ps1"
|
||||
& "$PSScriptRoot/check-drives.ps1"
|
||||
& "$PSScriptRoot/check-power.ps1"
|
||||
exit 0 # success
|
21
scripts/check-health.ps1
Executable file
21
scripts/check-health.ps1
Executable file
@ -0,0 +1,21 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the system health
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the system health of the local computer (hardware, software, and network) and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-health.ps1
|
||||
|
||||
H A R D W A R E
|
||||
✅ Intel(R) Core(TM) i5-6400 CPU @ 2.70GHz (CPU0, 2701MHz, socket U3E1, 30.1°C)
|
||||
...
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
& "$PSScriptRoot/check-hardware.ps1"
|
||||
& "$PSScriptRoot/check-software.ps1"
|
||||
& "$PSScriptRoot/check-network.ps1"
|
||||
exit 0 # success
|
28
scripts/check-independence-day.ps1
Executable file
28
scripts/check-independence-day.ps1
Executable file
@ -0,0 +1,28 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the time until Independence Day
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the time until Indepence Day and replies by text-to-speech (TTS).
|
||||
.EXAMPLE
|
||||
PS> ./check-independence-day.ps1
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Now = [DateTime]::Now
|
||||
$IndependenceDay = [Datetime]("07/04/" + $Now.Year)
|
||||
if ($Now -lt $IndependenceDay) {
|
||||
$Diff = $IndependenceDay – $Now
|
||||
& "$PSScriptRoot/speak-english.ps1" "Independence Day on July 4th is in $($Diff.Days) days."
|
||||
} else {
|
||||
$Diff = $Now - $IndependenceDay
|
||||
& "$PSScriptRoot/speak-english.ps1" "Independence Day on July 4th was $($Diff.Days) days ago."
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
41
scripts/check-ipv4-address.ps1
Executable file
41
scripts/check-ipv4-address.ps1
Executable file
@ -0,0 +1,41 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks an IPv4 address for validity
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the given IPv4 address for validity.
|
||||
.PARAMETER Address
|
||||
Specifies the IPv4 address to check
|
||||
.EXAMPLE
|
||||
PS> ./check-ipv4-address 192.168.11.22
|
||||
✔️ IPv4 192.168.11.22 is valid
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$Address = "")
|
||||
|
||||
function IsIPv4AddressValid { param([string]$IP)
|
||||
$RegEx = "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
|
||||
if ($IP -match $RegEx) {
|
||||
return $true
|
||||
} else {
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if ($Address -eq "" ) { $Address = read-host "Enter IPv4 address to validate" }
|
||||
|
||||
if (IsIPv4AddressValid $Address) {
|
||||
"✔️ IPv4 $Address is valid"
|
||||
exit 0 # success
|
||||
} else {
|
||||
write-warning "Invalid IPv4 address: $Address"
|
||||
exit 1
|
||||
}
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
55
scripts/check-ipv6-address.ps1
Executable file
55
scripts/check-ipv6-address.ps1
Executable file
@ -0,0 +1,55 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks an IPv6 address for validity
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the given IPv6 address for validity
|
||||
.PARAMETER Address
|
||||
Specifies the IPv6 address to check
|
||||
.EXAMPLE
|
||||
PS> ./check-ipv6-address fe80::200:5aee:feaa:20a2
|
||||
✔️ IPv6 fe80::200:5aee:feaa:20a2 is valid
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$Address = "")
|
||||
|
||||
function IsIPv6AddressValid { param([string]$IP)
|
||||
$IPv4Regex = '(((25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})\.){3}(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))'
|
||||
$G = '[a-f\d]{1,4}'
|
||||
$Tail = @(":",
|
||||
"(:($G)?|$IPv4Regex)",
|
||||
":($IPv4Regex|$G(:$G)?|)",
|
||||
"(:$IPv4Regex|:$G(:$IPv4Regex|(:$G){0,2})|:)",
|
||||
"((:$G){0,2}(:$IPv4Regex|(:$G){1,2})|:)",
|
||||
"((:$G){0,3}(:$IPv4Regex|(:$G){1,2})|:)",
|
||||
"((:$G){0,4}(:$IPv4Regex|(:$G){1,2})|:)")
|
||||
[string] $IPv6RegexString = $G
|
||||
$Tail | foreach { $IPv6RegexString = "${G}:($IPv6RegexString|$_)" }
|
||||
$IPv6RegexString = ":(:$G){0,5}((:$G){1,2}|:$IPv4Regex)|$IPv6RegexString"
|
||||
$IPv6RegexString = $IPv6RegexString -replace '\(' , '(?:' # make all groups non-capturing
|
||||
[regex] $IPv6Regex = $IPv6RegexString
|
||||
if ($IP -imatch "^$IPv6Regex$") {
|
||||
return $true
|
||||
} else {
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if ($Address -eq "" ) {
|
||||
$Address = read-host "Enter IPv6 address to validate"
|
||||
}
|
||||
if (IsIPv6AddressValid $Address) {
|
||||
"✔️ IPv6 $Address is valid"
|
||||
exit 0 # success
|
||||
} else {
|
||||
write-warning "Invalid IPv6 address: $Address"
|
||||
exit 1
|
||||
}
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
22
scripts/check-iss-position.ps1
Executable file
22
scripts/check-iss-position.ps1
Executable file
@ -0,0 +1,22 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the ISS position
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the position of the International Space Station (ISS) and replies by text-to-speech (TTS).
|
||||
.EXAMPLE
|
||||
PS> ./check-iss-position
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$ISS = (Invoke-WebRequest "http://api.open-notify.org/iss-now.json" -userAgent "curl" -useBasicParsing).Content | ConvertFrom-Json
|
||||
|
||||
& "$PSScriptRoot/speak-english.ps1" "The International Space Station is currently at $($ISS.iss_position.longitude)° longitude and $($ISS.iss_position.latitude)° latitude."
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
43
scripts/check-mac-address.ps1
Executable file
43
scripts/check-mac-address.ps1
Executable file
@ -0,0 +1,43 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the given MAC address for validity
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the given MAC address for validity
|
||||
Supported MAC address formats are: 00:00:00:00:00:00 or 00-00-00-00-00-00 or 000000000000.
|
||||
.PARAMETER MAC
|
||||
Specifies the MAC address to check
|
||||
.EXAMPLE
|
||||
PS> ./check-mac-address 11:22:33:44:55:66
|
||||
✔️ MAC address 11:22:33:44:55:66 is valid
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$MAC = "")
|
||||
|
||||
function IsMACAddressValid { param([string]$mac)
|
||||
$RegEx = "^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})|([0-9A-Fa-f]{2}){6}$"
|
||||
if ($mac -match $RegEx) {
|
||||
return $true
|
||||
} else {
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if ($MAC -eq "" ) {
|
||||
$MAC = read-host "Enter MAC address to validate"
|
||||
}
|
||||
if (IsMACAddressValid $MAC) {
|
||||
"✔️ MAC address $MAC is valid"
|
||||
exit 0 # success
|
||||
} else {
|
||||
write-warning "Invalid MAC address: $MAC"
|
||||
exit 1
|
||||
}
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
41
scripts/check-midnight.ps1
Executable file
41
scripts/check-midnight.ps1
Executable file
@ -0,0 +1,41 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks for Midnight
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the time until Midnight and replies by text-to-speech (TTS).
|
||||
.EXAMPLE
|
||||
PS> ./check-midnight
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function TimeSpanToString { param([TimeSpan]$Delta)
|
||||
$Result = ""
|
||||
if ($Delta.Hours -eq 1) { $Result += "1 hour and "
|
||||
} elseif ($Delta.Hours -gt 1) { $Result += "$($Delta.Hours) hours and "
|
||||
}
|
||||
if ($Delta.Minutes -eq 1) { $Result += "1 minute"
|
||||
} else { $Result += "$($Delta.Minutes) minutes"
|
||||
}
|
||||
return $Result
|
||||
}
|
||||
|
||||
try {
|
||||
$Now = [DateTime]::Now
|
||||
if ($Now.Hour -lt 12) {
|
||||
$Midnight = Get-Date -Hour 0 -Minute 0 -Second 0
|
||||
$TimeSpan = TimeSpanToString($Now - $Midnight)
|
||||
$Reply = "Midnight was $TimeSpan ago."
|
||||
} else {
|
||||
$Midnight = Get-Date -Hour 23 -Minute 59 -Second 59
|
||||
$TimeSpan = TimeSpanToString($Midnight - $Now)
|
||||
$Reply = "Midnight is in $TimeSpan."
|
||||
}
|
||||
& "$PSScriptRoot/speak-english.ps1" "$Reply"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
23
scripts/check-month.ps1
Executable file
23
scripts/check-month.ps1
Executable file
@ -0,0 +1,23 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Gets the current month name
|
||||
.DESCRIPTION
|
||||
This PowerShell script determines and speaks the current month name by text-to-speech (TTS).
|
||||
.EXAMPLE
|
||||
PS> ./check-month
|
||||
✔️ It's December.
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
[system.threading.thread]::currentthread.currentculture=[system.globalization.cultureinfo]"en-US"
|
||||
$MonthName = (Get-Date -UFormat %B)
|
||||
& "$PSScriptRoot/speak-english.ps1" "It's $MonthName."
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
43
scripts/check-moon-phase.ps1
Executable file
43
scripts/check-moon-phase.ps1
Executable file
@ -0,0 +1,43 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the Moon phase
|
||||
.DESCRIPTION
|
||||
This PowerShell script determines the Moon phase and answers by text-to-speech (TTS).
|
||||
.EXAMPLE
|
||||
PS> ./check-moon-phase
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$LunarCycle = 29.53058868 # synodic period in days, time between successive new moons
|
||||
$LunarHalfCycle = $LunarCycle / 2.0
|
||||
$Phases = @("New moon", "Waxing crescent moon", "First quarter moon", "Waxing gibbous moon", "Full moon", "Waning gibbous moon", "Last quarter moon", "Waning crescent moon")
|
||||
$PhaseLength = $LunarCycle / 8.0
|
||||
$PhaseHalfLength = $PhaseLength / 2.0
|
||||
|
||||
$RefDate = get-date -Year 2021 -Month 12 -Day 4 -Hour 6 -Minute 43 # Dec 4, 2021 06:43 UTC [New Moon]
|
||||
$Now = get-date
|
||||
$TimeInterval = New-TimeSpan -Start $RefDate -End $Now
|
||||
$Days = $TimeInterval.TotalDays
|
||||
|
||||
$MDays = $Days % $LunarCycle
|
||||
$PhaseIndex = [int]($MDays * (8.0 / $LunarCycle))
|
||||
|
||||
$Visibility = [math]::Round((($Days % $LunarHalfCycle) * 100) / $LunarHalfCycle)
|
||||
$Reply = "$($Phases[$PhaseIndex]) with $($Visibility)% visibility"
|
||||
|
||||
$MoonAge = [math]::Round($Days % $LunarCycle)
|
||||
if ($MoonAge -eq "0") { $Reply += " today"
|
||||
} elseif ($MoonAge -eq "1") { $Reply += " since yesterday"
|
||||
} else { $Reply += ", last new moon was $MoonAge days ago"
|
||||
}
|
||||
|
||||
& "$PSScriptRoot/speak-english.ps1" "$Reply"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
25
scripts/check-network.ps1
Executable file
25
scripts/check-network.ps1
Executable file
@ -0,0 +1,25 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the network details
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the network details of the local computer and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-network.ps1
|
||||
|
||||
N E T W O R K
|
||||
✅ Online with 30ms latency (16ms..56ms, 0/10 loss)
|
||||
...
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
" "
|
||||
& "$PSScriptRoot/write-green.ps1" " N E T W O R K"
|
||||
& "$PSScriptRoot/check-ping.ps1"
|
||||
& "$PSScriptRoot/check-firewall"
|
||||
& "$PSScriptRoot/check-dns.ps1"
|
||||
& "$PSScriptRoot/check-vpn.ps1"
|
||||
& "$PSScriptRoot/list-public-ip.ps1"
|
||||
exit 0 # success
|
27
scripts/check-new-year.ps1
Executable file
27
scripts/check-new-year.ps1
Executable file
@ -0,0 +1,27 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the time until New Year
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the time until New Year and replies by text-to-speech (TTS).
|
||||
.EXAMPLE
|
||||
PS> ./check-new-year
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Now = [DateTime]::Now
|
||||
$NewYear = [Datetime]("12/31/" + $Now.Year)
|
||||
$Days = ($NewYear – $Now).Days + 1
|
||||
if ($Days -gt 1) {
|
||||
& "$PSScriptRoot/speak-english.ps1" "New Year is in $Days days."
|
||||
} elseif ($Days -eq 1) {
|
||||
& "$PSScriptRoot/speak-english.ps1" "New Year is tomorrow."
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
40
scripts/check-noon.ps1
Executable file
40
scripts/check-noon.ps1
Executable file
@ -0,0 +1,40 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks for Noon
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the time until Noon and replies by text-to-speech (TTS).
|
||||
.EXAMPLE
|
||||
PS> ./check-noon
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function TimeSpanToString { param([TimeSpan]$Delta)
|
||||
$Result = ""
|
||||
if ($Delta.Hours -eq 1) { $Result += "1 hour and "
|
||||
} elseif ($Delta.Hours -gt 1) { $Result += "$($Delta.Hours) hours and "
|
||||
}
|
||||
if ($Delta.Minutes -eq 1) { $Result += "1 minute"
|
||||
} else { $Result += "$($Delta.Minutes) minutes"
|
||||
}
|
||||
return $Result
|
||||
}
|
||||
|
||||
try {
|
||||
$Now = [DateTime]::Now
|
||||
$Noon = Get-Date -Hour 12 -Minute 0 -Second 0
|
||||
if ($Now -lt $Noon) {
|
||||
$TimeSpan = TimeSpanToString($Noon - $Now)
|
||||
$Reply = "Noon is in $TimeSpan."
|
||||
} else {
|
||||
$TimeSpan = TimeSpanToString($Now - $Noon)
|
||||
$Reply = "Noon was $TimeSpan ago."
|
||||
}
|
||||
& "$PSScriptRoot/speak-english.ps1" "$Reply"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
39
scripts/check-os.ps1
Executable file
39
scripts/check-os.ps1
Executable file
@ -0,0 +1,39 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the OS status
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the operating system status and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-os.ps1
|
||||
✅ Windows 10 Pro 64-bit (v10.0.19045, since 6/22/2021, S/N 00123-45678-15135-AAOEM, P/K AB123-CD456-EF789-GH000-WFR6P)
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
$Name = $PSVersionTable.OS
|
||||
if ([System.Environment]::Is64BitOperatingSystem) { $Arch = "64-bit" } else { $Arch = "32-bit" }
|
||||
Write-Host "✅ $Name $Arch"
|
||||
} else {
|
||||
$OS = Get-WmiObject -class Win32_OperatingSystem
|
||||
$Name = $OS.Caption -Replace "Microsoft Windows","Windows"
|
||||
$Arch = $OS.OSArchitecture
|
||||
$Version = $OS.Version
|
||||
|
||||
[system.threading.thread]::currentthread.currentculture = [system.globalization.cultureinfo]"en-US"
|
||||
$OSDetails = Get-CimInstance Win32_OperatingSystem
|
||||
$BuildNo = $OSDetails.BuildNumber
|
||||
$Serial = $OSDetails.SerialNumber
|
||||
$InstallDate = $OSDetails.InstallDate
|
||||
|
||||
$ProductKey = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform" -Name BackupProductKeyDefault).BackupProductKeyDefault
|
||||
Write-Host "✅ $Name $Arch (v$Version, since $($InstallDate.ToShortDateString()), S/N $Serial, P/K $ProductKey)"
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
31
scripts/check-outlook.ps1
Executable file
31
scripts/check-outlook.ps1
Executable file
@ -0,0 +1,31 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks Outlook's inbox
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the inbox of Outlook for new/unread mails.
|
||||
.EXAMPLE
|
||||
PS> ./check-outlook.ps1
|
||||
✅ No new mails.
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
Add-Type -assembly "Microsoft.Office.Interop.Outlook"
|
||||
$Outlook = New-Object -comobject Outlook.Application
|
||||
$Namespace = $Outlook.GetNameSpace("MAPI")
|
||||
$Inbox = $Namespace.GetDefaultFolder(6) # 6 = olFolderInbox
|
||||
[int]$Unread = 0
|
||||
foreach($Mail in $Inbox.Items) {
|
||||
if ($Mail.Unread -eq $false) { continue }
|
||||
"⚠️ New mail '$($Mail.Subject)' from $($Mail.SenderName)."
|
||||
$Unread++
|
||||
}
|
||||
if ($Unread -eq 0) { "✅ No new mails." }
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"Sorry: $($Error[0])"
|
||||
exit 1
|
||||
}
|
52
scripts/check-password.ps1
Executable file
52
scripts/check-password.ps1
Executable file
@ -0,0 +1,52 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks a password
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the security status of the given password by haveibeenpwned.com
|
||||
.EXAMPLE
|
||||
PS> ./check-password qwerty
|
||||
⚠️ Bad password, it's already listed in 10584568 known security breaches!
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$password = "")
|
||||
|
||||
function CalculateHashSHA1 ([string]$string) {
|
||||
$sha1 = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider
|
||||
$encoder = New-Object System.Text.UTF8Encoding
|
||||
$bytes = $encoder.GetBytes($string)
|
||||
$hash = ($sha1.ComputeHash($bytes) | % { $_.ToString("X2") }) -join ''
|
||||
return $hash
|
||||
}
|
||||
|
||||
function Get-PasswordPwnCount { [CmdletBinding()] param([string]$pass)
|
||||
$hash = CalculateHashSHA1 $pass
|
||||
try {
|
||||
$uri = "https://api.pwnedpasswords.com/range/$($hash.Substring(0,5))"
|
||||
$list = -split (Invoke-RestMethod $uri -Verbose:($PSBoundParameters['Verbose'] -eq $true) -ErrorAction Stop) # split into separate strings
|
||||
$pwn = $list | Select-String $hash.Substring(5,35) # grep
|
||||
if ($pwn) { $count = [int] ($pwn.ToString().Split(':')[1]) } else { $count = 0 }
|
||||
return $count
|
||||
}
|
||||
catch {
|
||||
Write-Error "Error Calling HIBP API"
|
||||
return $null
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if ($password -eq "") { $password = Read-Host "Enter the password" }
|
||||
$NumBreaches = Get-PasswordPwnCount $password
|
||||
if ($NumBreaches -eq 0) {
|
||||
"👍 Password seems good, it's not listed in any known security breach as of today."
|
||||
} else {
|
||||
"⚠️ Bad password, it's listed already in $NumBreaches known security breaches!"
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
73
scripts/check-pending-reboot.ps1
Executable file
73
scripts/check-pending-reboot.ps1
Executable file
@ -0,0 +1,73 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Check for pending reboots
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries pending operating system reboots and prints it.
|
||||
.EXAMPLE
|
||||
./check-pending-reboot.ps1
|
||||
✅ No pending reboot
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function Test-RegistryValue { param([parameter(Mandatory=$true)][ValidateNotNullOrEmpty()]$Path, [parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()]$Value)
|
||||
try {
|
||||
Get-ItemProperty -Path $Path -Name $Value -EA Stop
|
||||
return $true
|
||||
} catch {
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
$Reason = ""
|
||||
if ($IsLinux) {
|
||||
if (Test-Path "/var/run/reboot-required") {
|
||||
$Reason = "found: /var/run/reboot-required"
|
||||
Write-Host "⚠️ Pending reboot ($Reason)"
|
||||
}
|
||||
} else {
|
||||
if (Test-Path -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired") {
|
||||
$Reason += ", ...\Auto Update\RebootRequired"
|
||||
}
|
||||
if (Test-Path -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\PostRebootReporting") {
|
||||
$Reason += ", ...\Auto Update\PostRebootReporting"
|
||||
}
|
||||
if (Test-Path -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending") {
|
||||
$Reason += ", ...\Component Based Servicing\RebootPending"
|
||||
}
|
||||
if (Test-Path -Path "HKLM:\SOFTWARE\Microsoft\ServerManager\CurrentRebootAttempts") {
|
||||
$Reason += ", ...\ServerManager\CurrentRebootAttempts"
|
||||
}
|
||||
if (Test-RegistryValue -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing" -Value "RebootInProgress") {
|
||||
$Reason += ", ...\CurrentVersion\Component Based Servicing with 'RebootInProgress'"
|
||||
}
|
||||
if (Test-RegistryValue -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\Component Based Servicing" -Value "PackagesPending") {
|
||||
$Reason += ", '...\CurrentVersion\Component Based Servicing' with 'PackagesPending'"
|
||||
}
|
||||
if (Test-RegistryValue -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager" -Value "PendingFileRenameOperations2") {
|
||||
$Reason += ", '...\CurrentControlSet\Control\Session Manager' with 'PendingFileRenameOperations2'"
|
||||
}
|
||||
if (Test-RegistryValue -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" -Value "DVDRebootSignal") {
|
||||
$Reason += ", '...\Windows\CurrentVersion\RunOnce' with 'DVDRebootSignal'"
|
||||
}
|
||||
if (Test-RegistryValue -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon" -Value "JoinDomain") {
|
||||
$Reason += ", '...\CurrentControlSet\Services\Netlogon' with 'JoinDomain'"
|
||||
}
|
||||
if (Test-RegistryValue -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon" -Value "AvoidSpnSet") {
|
||||
$Reason += ", '...\CurrentControlSet\Services\Netlogon' with 'AvoidSpnSet'"
|
||||
}
|
||||
if ($Reason -ne "") {
|
||||
Write-Host "⚠️ Pending reboot (registry contains $($Reason.substring(2)))"
|
||||
}
|
||||
}
|
||||
if ($Reason -eq "") {
|
||||
Write-Host "✅ No pending reboot"
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
47
scripts/check-ping.ps1
Executable file
47
scripts/check-ping.ps1
Executable file
@ -0,0 +1,47 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the ping latency
|
||||
.DESCRIPTION
|
||||
This PowerShell script measures the ping roundtrip times from the local computer to other computers (10 Internet servers by default).
|
||||
.PARAMETER hosts
|
||||
Specifies the hosts to check, seperated by commata (default is: amazon.com,bing.com,cnn.com,dropbox.com,github.com,google.com,live.com,meta.com,x.com,youtube.com)
|
||||
.EXAMPLE
|
||||
PS> ./check-ping.ps1
|
||||
✅ Online with 18ms latency average (13ms...109ms, 0/10 ping loss)
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$hosts = "bing.com,cnn.com,dropbox.com,github.com,google.com,ibm.com,live.com,meta.com,x.com,youtube.com")
|
||||
|
||||
try {
|
||||
$hostsArray = $hosts.Split(",")
|
||||
$parallelTasks = $hostsArray | foreach {
|
||||
(New-Object Net.NetworkInformation.Ping).SendPingAsync($_,750)
|
||||
}
|
||||
[int]$min = 9999999
|
||||
[int]$max = [int]$avg = [int]$success = 0
|
||||
[int]$total = $hostsArray.Count
|
||||
[Threading.Tasks.Task]::WaitAll($parallelTasks)
|
||||
foreach($ping in $parallelTasks.Result) {
|
||||
if ($ping.Status -ne "Success") { continue }
|
||||
$success++
|
||||
[int]$latency = $ping.RoundtripTime
|
||||
$avg += $latency
|
||||
if ($latency -lt $min) { $min = $latency }
|
||||
if ($latency -gt $max) { $max = $latency }
|
||||
}
|
||||
[int]$loss = $total - $success
|
||||
if ($success -ne 0) {
|
||||
$avg /= $success
|
||||
Write-Host "✅ Online with $($avg)ms latency average ($($min)ms...$($max)ms, $loss/$total ping loss)"
|
||||
} else {
|
||||
Write-Host "⚠️ Offline ($loss/$total ping loss)"
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
58
scripts/check-power.ps1
Executable file
58
scripts/check-power.ps1
Executable file
@ -0,0 +1,58 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the power status
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the power status and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-power.ps1
|
||||
⚠️ Battery at 9% · 54 min remaining · power scheme 'HP Optimized'
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
$reply = "✅ AC powered" # TODO, just guessing :-)
|
||||
} else {
|
||||
Add-Type -Assembly System.Windows.Forms
|
||||
$details = [System.Windows.Forms.SystemInformation]::PowerStatus
|
||||
[int]$percent = 100 * $details.BatteryLifePercent
|
||||
[int]$remaining = $details.BatteryLifeRemaining / 60
|
||||
if ($details.PowerLineStatus -eq "Online") {
|
||||
if ($details.BatteryChargeStatus -eq "NoSystemBattery") {
|
||||
$reply = "✅ AC powered"
|
||||
} elseif ($percent -ge 95) {
|
||||
$reply = "✅ Battery $percent% fully charged"
|
||||
} else {
|
||||
$reply = "✅ Battery charging... ($percent%)"
|
||||
}
|
||||
} else { # must be offline
|
||||
if (($remaining -eq 0) -and ($percent -ge 60)) {
|
||||
$reply = "✅ Battery $percent% full"
|
||||
} elseif ($remaining -eq 0) {
|
||||
$reply = "✅ Battery at $percent%"
|
||||
} elseif ($remaining -le 5) {
|
||||
$reply = "⚠️ Battery at $percent% · ONLY $($remaining)min remaining"
|
||||
} elseif ($remaining -le 30) {
|
||||
$reply = "⚠️ Battery at $percent% · only $($remaining)min remaining"
|
||||
} elseif ($percent -lt 10) {
|
||||
$reply = "⚠️ Battery at $percent% · $($remaining)min remaining"
|
||||
} elseif ($percent -ge 60) {
|
||||
$reply = "✅ Battery $percent% full · $($remaining)min remaining"
|
||||
} else {
|
||||
$reply = "✅ Battery at $percent% · $($remaining)min remaining"
|
||||
}
|
||||
}
|
||||
$powerScheme = (powercfg /getactivescheme)
|
||||
$powerScheme = $powerScheme -Replace "^(.*) \(",""
|
||||
$powerScheme = $powerScheme -Replace "\)$",""
|
||||
$reply += " · power scheme '$powerScheme'"
|
||||
}
|
||||
Write-Output $reply
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
30
scripts/check-powershell.ps1
Executable file
30
scripts/check-powershell.ps1
Executable file
@ -0,0 +1,30 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Check the PowerShell status
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the PowerShell status and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-powershell.ps1
|
||||
✅ PowerShell 5.1.19041.2673 Desktop edition (10 modules, 1458 cmdlets, 172 aliases)
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$version = $PSVersionTable.PSVersion
|
||||
$edition = $PSVersionTable.PSEdition
|
||||
$numModules = (Get-Module).Count
|
||||
$numAliases = (Get-Alias).Count
|
||||
if ($IsLinux) {
|
||||
"✅ PowerShell $version $edition edition ($numModules modules, $numAliases aliases)"
|
||||
} else {
|
||||
$numCmdlets = (Get-Command -Command-Type cmdlet).Count
|
||||
"✅ PowerShell $version $edition edition ($numModules modules, $numCmdlets cmdlets, $numAliases aliases)"
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
33
scripts/check-ps1-file.ps1
Executable file
33
scripts/check-ps1-file.ps1
Executable file
@ -0,0 +1,33 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks PowerShell file(s) for validity
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the given PowerShell script file(s) for validity.
|
||||
.PARAMETER filePattern
|
||||
Specifies the file pattern to the PowerShell file(s)
|
||||
.EXAMPLE
|
||||
PS> ./check-ps1-file *.ps1
|
||||
✔️ Valid PowerShell in myfile.ps1
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$filePattern = "")
|
||||
|
||||
try {
|
||||
if ($filePattern -eq "" ) { $path = Read-Host "Enter the file pattern to the PowerShell file(s)" }
|
||||
|
||||
$files = Get-ChildItem -path "$filePattern" -attributes !Directory
|
||||
foreach ($file in $files) {
|
||||
$syntaxError = @()
|
||||
[void][System.Management.Automation.Language.Parser]::ParseFile($file, [ref]$null, [ref]$syntaxError)
|
||||
if ("$syntaxError" -ne "") { throw "$syntaxError" }
|
||||
"✔️ Valid PowerShell in $($file.Name)"
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
79
scripts/check-ram.ps1
Executable file
79
scripts/check-ram.ps1
Executable file
@ -0,0 +1,79 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the RAM
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the status of the installed RAM memory modules and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-ram.ps1
|
||||
✅ 16GB DDR4 RAM @ 3200MHz by Micron (in CPU0/CPU0-DIMM3 @ 1.2V)
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function GetRAMType { param([int]$Type)
|
||||
switch($Type) {
|
||||
2 { return "DRAM" }
|
||||
5 { return "EDO RAM" }
|
||||
6 { return "EDRAM" }
|
||||
7 { return "VRAM" }
|
||||
8 { return "SRAM" }
|
||||
10 { return "ROM" }
|
||||
11 { return "Flash" }
|
||||
12 { return "EEPROM" }
|
||||
13 { return "FEPROM" }
|
||||
14 { return "EPROM" }
|
||||
15 { return "CDRAM" }
|
||||
16 { return "3DRAM" }
|
||||
17 { return "SDRAM" }
|
||||
18 { return "SGRAM" }
|
||||
19 { return "RDRAM" }
|
||||
20 { return "DDR RAM" }
|
||||
21 { return "DDR2 RAM" }
|
||||
22 { return "DDR2 FB-DIMM" }
|
||||
24 { return "DDR3 RAM" }
|
||||
26 { return "DDR4 RAM" }
|
||||
27 { return "DDR5 RAM" }
|
||||
28 { return "DDR6 RAM" }
|
||||
29 { return "DDR7 RAM" }
|
||||
default { return "RAM" }
|
||||
}
|
||||
}
|
||||
|
||||
function Bytes2String { param([int64]$Bytes)
|
||||
if ($Bytes -lt 1024) { return "$Bytes bytes" }
|
||||
$Bytes /= 1024
|
||||
if ($Bytes -lt 1024) { return "$($Bytes)KB" }
|
||||
$Bytes /= 1024
|
||||
if ($Bytes -lt 1024) { return "$($Bytes)MB" }
|
||||
$Bytes /= 1024
|
||||
if ($Bytes -lt 1024) { return "$($Bytes)GB" }
|
||||
$Bytes /= 1024
|
||||
if ($Bytes -lt 1024) { return "$($Bytes)TB" }
|
||||
$Bytes /= 1024
|
||||
if ($Bytes -lt 1024) { return "$($Bytes)PB" }
|
||||
$Bytes /= 1024
|
||||
if ($Bytes -lt 1024) { return "$($Bytes)EB" }
|
||||
}
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
# TODO
|
||||
} else {
|
||||
$Banks = Get-WmiObject -Class Win32_PhysicalMemory
|
||||
foreach ($Bank in $Banks) {
|
||||
$Capacity = Bytes2String($Bank.Capacity)
|
||||
$Type = GetRAMType $Bank.SMBIOSMemoryType
|
||||
$Speed = $Bank.Speed
|
||||
[float]$Voltage = $Bank.ConfiguredVoltage / 1000.0
|
||||
$Manufacturer = $Bank.Manufacturer
|
||||
$Location = "$($Bank.BankLabel)/$($Bank.DeviceLocator)"
|
||||
Write-Host "✅ $Capacity $Type @ $($Speed)MHz by $Manufacturer (in $Location @ $($Voltage)V)"
|
||||
}
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
78
scripts/check-repo.ps1
Executable file
78
scripts/check-repo.ps1
Executable file
@ -0,0 +1,78 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks a repo
|
||||
.DESCRIPTION
|
||||
This PowerShell script verifies the integrity of a local Git repository.
|
||||
.PARAMETER RepoDir
|
||||
Specifies the path to the Git repository (current working directory by default)
|
||||
.EXAMPLE
|
||||
PS> ./check-repo.ps1 C:\MyRepo
|
||||
⏳ (1/10) Searching for Git executable... git version 2.41.0.windows.3
|
||||
⏳ (2/10) Checking local folder... 📂C:\MyRepo
|
||||
⏳ (3/10) Querying remote URL... git@github.com:fleschutz/PowerShell.git
|
||||
⏳ (4/10) Querying current branch... main
|
||||
⏳ (5/10) Fetching remote updates...
|
||||
⏳ (6/10) Querying latest tag... v0.8 (commit 02171a401d83b01a0cda0af426840b605e617f08)
|
||||
⏳ (7/10) Verifying data integrity...
|
||||
...
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$RepoDir = "$PWD")
|
||||
|
||||
try {
|
||||
$StopWatch = [system.diagnostics.stopwatch]::startNew()
|
||||
|
||||
Write-Host "⏳ (1/10) Searching for Git executable... " -noNewline
|
||||
& git --version
|
||||
if ($lastExitCode -ne "0") { throw "Can't execute 'git' - make sure Git is installed and available" }
|
||||
|
||||
Write-Host "⏳ (2/10) Checking local folder... " -noNewline
|
||||
$FullPath = Resolve-Path "$RepoDir"
|
||||
if (!(Test-Path "$FullPath" -pathType Container)) { throw "Can't access folder: $FullPath" }
|
||||
"📂$FullPath"
|
||||
|
||||
Write-Host "⏳ (3/10) Querying remote URL... " -noNewline
|
||||
& git -C "$FullPath" remote get-url origin
|
||||
if ($lastExitCode -ne "0") { throw "'git remote get-url origin' failed with exit code $lastExitCode" }
|
||||
|
||||
Write-Host "⏳ (4/10) Querying current branch... " -noNewline
|
||||
& git -C "$FullPath" branch --show-current
|
||||
if ($lastExitCode -ne "0") { throw "'git branch --show-current' failed with exit code $lastExitCode" }
|
||||
|
||||
Write-Host "⏳ (5/10) Fetching remote updates..."
|
||||
& git -C "$FullPath" fetch
|
||||
if ($lastExitCode -ne "0") { throw "'git fetch' failed with exit code $lastExitCode" }
|
||||
|
||||
Write-Host "⏳ (6/10) Querying latest tag... " -noNewline
|
||||
$LatestTagCommitID = (git -C "$FullPath" rev-list --tags --max-count=1)
|
||||
$LatestTagName = (git -C "$FullPath" describe --tags $LatestTagCommitID)
|
||||
Write-Host "$LatestTagName (commit $LatestTagCommitID)"
|
||||
|
||||
Write-Host "⏳ (7/10) Verifying data integrity..."
|
||||
& git -C "$FullPath" fsck
|
||||
if ($lastExitCode -ne "0") { throw "'git fsck' failed with exit code $lastExitCode" }
|
||||
|
||||
Write-Host "⏳ (8/10) Running maintenance tasks..."
|
||||
& git -C "$FullPath" maintenance run
|
||||
if ($lastExitCode -ne "0") { throw "'git maintenance run' failed with exit code $lastExitCode" }
|
||||
|
||||
Write-Host "⏳ (9/10) Checking submodule status..."
|
||||
& git -C "$FullPath" submodule status
|
||||
if ($lastExitCode -ne "0") { throw "'git submodule status' failed with exit code $lastExitCode" }
|
||||
|
||||
Write-Host "⏳ (10/10) Checking repo status... " -noNewline
|
||||
& git -C "$FullPath" status
|
||||
if ($lastExitCode -ne "0") { throw "'git status --short' failed with exit code $lastExitCode" }
|
||||
|
||||
$RepoDirName = (Get-Item "$FullPath").Name
|
||||
[int]$Elapsed = $StopWatch.Elapsed.TotalSeconds
|
||||
"✔️ Checked repo 📂$RepoDirName in $Elapsed sec"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
23
scripts/check-santa.ps1
Executable file
23
scripts/check-santa.ps1
Executable file
@ -0,0 +1,23 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the time until Saint Nicholas Day
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the time until Saint Nicholas Day and replies by text-to-speech (TTS).
|
||||
.EXAMPLE
|
||||
PS> ./check-santa
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$Now = [DateTime]::Now
|
||||
$Diff = [Datetime]("12/06/" + $Now.Year) – $Now
|
||||
|
||||
& "$PSScriptRoot/speak-english.ps1" "Saint Nicholas Day is in $($Diff.Days) days."
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
76
scripts/check-smart-devices.ps1
Executable file
76
scripts/check-smart-devices.ps1
Executable file
@ -0,0 +1,76 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the SMART device status
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the status of the SSD/HDD devices (supporting S.M.A.R.T.) and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-smart-devices.ps1
|
||||
✅ 1TB Samsung SSD 970 EVO via NVMe (2388 hours, 289x on, v2B2QEXE7, 37°C, selftest passed)
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function Bytes2String { param([int64]$Bytes)
|
||||
if ($Bytes -lt 1000) { return "$Bytes bytes" }
|
||||
$Bytes /= 1000
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)KB" }
|
||||
$Bytes /= 1000
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)MB" }
|
||||
$Bytes /= 1000
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)GB" }
|
||||
$Bytes /= 1000
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)TB" }
|
||||
$Bytes /= 1000
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)PB" }
|
||||
$Bytes /= 1000
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)EB" }
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Progress "(1/3) Searching for smartmontools..."
|
||||
$Result = (smartctl --version)
|
||||
if ($lastExitCode -ne "0") { throw "Can't execute 'smartctl' - make sure smartmontools are installed" }
|
||||
|
||||
Write-Progress "(2/3) Scanning S.M.A.R.T devices..."
|
||||
if ($IsLinux) {
|
||||
$Devices = $(sudo smartctl --scan-open)
|
||||
} else {
|
||||
$Devices = $(smartctl --scan-open)
|
||||
}
|
||||
|
||||
foreach($Device in $Devices) {
|
||||
Write-Progress "(3/3) Querying S.M.A.R.T devices..."
|
||||
$Array = $Device.split(" ")
|
||||
$Device = $Array[0]
|
||||
if ("$Device" -eq "#") {
|
||||
continue
|
||||
} elseif ($IsLinux) {
|
||||
$Details = (sudo smartctl --all --json $Device) | ConvertFrom-Json
|
||||
$null = (sudo smartctl --test=short $Device)
|
||||
} else {
|
||||
$Details = (smartctl --all --json $Device) | ConvertFrom-Json
|
||||
$null = (smartctl --test=short $Device)
|
||||
}
|
||||
$ModelName = $Details.model_name
|
||||
$Protocol = $Details.device.protocol
|
||||
[int64]$GBytes = $Details.user_capacity.bytes
|
||||
if ($GBytes -gt 0) {
|
||||
$Capacity = "$(Bytes2String $GBytes) "
|
||||
} else {
|
||||
$Capacity = ""
|
||||
}
|
||||
$Temp = $Details.temperature.current
|
||||
$Firmware = $Details.firmware_version
|
||||
$PowerOn = $Details.power_cycle_count
|
||||
$Hours = $Details.power_on_time.hours
|
||||
if ($Details.smart_status.passed) { $Status = "passed" } else { $Status = "FAILED" }
|
||||
Write-Progress -completed " "
|
||||
Write-Host "✅ $($Capacity)$ModelName via $Protocol ($Hours hours, $($PowerOn)x on, v$($Firmware), $($Temp)°C, selftest $Status)"
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
29
scripts/check-software.ps1
Executable file
29
scripts/check-software.ps1
Executable file
@ -0,0 +1,29 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the software
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the software status of the local computer and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-software.ps1
|
||||
|
||||
S O F T W A R E
|
||||
✅ BIOS model 'P62 v02.67' version HPQOEM - 0 by HP
|
||||
✅ Windows 10 Pro 64-Bit (v10.0.19045, since 5/2/2021)
|
||||
...
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
" "
|
||||
& "$PSScriptRoot/write-green.ps1" " S O F T W A R E"
|
||||
& "$PSScriptRoot/check-bios.ps1"
|
||||
& "$PSScriptRoot/check-os.ps1"
|
||||
& "$PSScriptRoot/check-uptime.ps1"
|
||||
& "$PSScriptRoot/check-apps.ps1"
|
||||
& "$PSScriptRoot/check-powershell.ps1"
|
||||
& "$PSScriptRoot/check-time-zone.ps1"
|
||||
& "$PSScriptRoot/check-swap-space.ps1"
|
||||
& "$PSScriptRoot/check-pending-reboot.ps1"
|
||||
exit 0 # success
|
41
scripts/check-subnet-mask.ps1
Executable file
41
scripts/check-subnet-mask.ps1
Executable file
@ -0,0 +1,41 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the given subnet mask for validity
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the given subnet mask for validity.
|
||||
.PARAMETER address
|
||||
Specifies the subnet mask to check
|
||||
.EXAMPLE
|
||||
PS> ./check-subnet-mask.ps1 255.255.255.0
|
||||
✔️ subnet mask 255.255.255.0 is valid
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$address = "")
|
||||
|
||||
function IsSubNetMaskValid { param([string]$IP)
|
||||
$RegEx = "^(254|252|248|240|224|192|128).0.0.0$|^255.(254|252|248|240|224|192|128|0).0.0$|^255.255.(254|252|248|240|224|192|128|0).0$|^255.255.255.(255|254|252|248|240|224|192|128|0)$"
|
||||
if ($IP -match $RegEx) {
|
||||
return $true
|
||||
} else {
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if ($address -eq "" ) { $address = read-host "Enter subnet mask to validate" }
|
||||
|
||||
if (IsSubNetMaskValid $address) {
|
||||
"✔️ subnet mask $Address is valid"
|
||||
exit 0 # success
|
||||
} else {
|
||||
write-warning "Invalid subnet mask: $address"
|
||||
exit 1
|
||||
}
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
62
scripts/check-swap-space.ps1
Executable file
62
scripts/check-swap-space.ps1
Executable file
@ -0,0 +1,62 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the swap space
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the current status of the swap space and prints it.
|
||||
.PARAMETER minLevel
|
||||
Specifies the minimum level in GB (10 GB by default)
|
||||
.EXAMPLE
|
||||
PS> ./check-swap-space.ps1
|
||||
✅ Swap space uses 42%, 748MB free of 1GB
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([int]$minLevel = 10)
|
||||
|
||||
function MB2String { param([int64]$Bytes)
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)MB" }
|
||||
$Bytes /= 1000
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)GB" }
|
||||
$Bytes /= 1000
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)TB" }
|
||||
$Bytes /= 1000
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)PB" }
|
||||
$Bytes /= 1000
|
||||
if ($Bytes -lt 1000) { return "$($Bytes)EB" }
|
||||
}
|
||||
|
||||
try {
|
||||
[int64]$Total = [int64]$Used = [int64]$Free = 0
|
||||
if ($IsLinux) {
|
||||
$Result = $(free --mega | grep Swap:)
|
||||
[int64]$Total = $Result.subString(5,14)
|
||||
[int64]$Used = $Result.substring(20,13)
|
||||
[int64]$Free = $Result.substring(32,11)
|
||||
} else {
|
||||
$Items = Get-WmiObject -class "Win32_PageFileUsage" -namespace "root\CIMV2" -computername localhost
|
||||
foreach ($Item in $Items) {
|
||||
$Total += $Item.AllocatedBaseSize
|
||||
$Used += $Item.CurrentUsage
|
||||
$Free += ($Total - $Used)
|
||||
}
|
||||
}
|
||||
if ($Total -eq 0) {
|
||||
Write-Output "⚠️ No swap space configured"
|
||||
} elseif ($Free -eq 0) {
|
||||
Write-Output "⚠️ Swap space of $(MB2String $Total) is full"
|
||||
} elseif ($Free -lt $minLevel) {
|
||||
Write-Output "⚠️ Swap space of $(MB2String $Total) is nearly full, only $(MB2String $Free) free"
|
||||
} elseif ($Used -eq 0) {
|
||||
Write-Output "✅ Swap space of $(MB2String $Total) reserved"
|
||||
} else {
|
||||
[int]$Percent = ($Used * 100) / $Total
|
||||
Write-Output "✅ Swap space uses $Percent%, $(MB2String $Free) free of $(MB2String $Total)"
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
55
scripts/check-symlinks.ps1
Executable file
55
scripts/check-symlinks.ps1
Executable file
@ -0,0 +1,55 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks symlinks in a folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks every symbolic link in a folder (including subfolders).
|
||||
It returns the number of broken symlinks as exit value.
|
||||
.PARAMETER folder
|
||||
Specifies the path to the folder
|
||||
.EXAMPLE
|
||||
PS> ./check-symlinks C:\Users
|
||||
⏳ Checking symlinks at 📂C:\Users including subfolders...
|
||||
✔️ Found 0 broken symlinks at 📂C:\Users in 60 sec
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$Folder = "")
|
||||
|
||||
try {
|
||||
if ($Folder -eq "" ) { $Folder = read-host "Enter the path to the folder" }
|
||||
|
||||
$StopWatch = [system.diagnostics.stopwatch]::startNew()
|
||||
$FullPath = Resolve-Path "$Folder"
|
||||
"⏳ Checking symlinks at 📂$FullPath including subfolders..."
|
||||
|
||||
[int]$NumTotal = [int]$NumBroken = 0
|
||||
Get-ChildItem $FullPath -recurse | Where { $_.Attributes -match "ReparsePoint" } | ForEach-Object {
|
||||
$Symlink = $_.FullName
|
||||
$Target = ($_ | Select-Object -ExpandProperty Target -ErrorAction Ignore)
|
||||
if ($Target) {
|
||||
$path = $_.FullName + "\..\" + ($_ | Select-Object -ExpandProperty Target)
|
||||
$item = Get-Item $path -ErrorAction Ignore
|
||||
if (!$item) {
|
||||
$NumBroken++
|
||||
"Symlink $Symlink to: $Target seems broken (#$NumBroken)"
|
||||
}
|
||||
}
|
||||
$NumTotal++
|
||||
}
|
||||
|
||||
[int]$Elapsed = $StopWatch.Elapsed.TotalSeconds
|
||||
if ($NumTotal -eq 0) {
|
||||
"✔️ No symlink found at 📂$FullPath in $Elapsed sec"
|
||||
} elseif ($NumBroken -eq 1) {
|
||||
"✔️ Found $NumBroken broken symlink at 📂$FullPath in $Elapsed sec"
|
||||
} else {
|
||||
"✔️ Found $NumBroken broken symlinks at 📂$FullPath in $Elapsed sec"
|
||||
}
|
||||
exit $NumBroken
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
31
scripts/check-time-zone.ps1
Executable file
31
scripts/check-time-zone.ps1
Executable file
@ -0,0 +1,31 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the time zone
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the time zone and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-time-zone.ps1
|
||||
✅ 11:13 AM W. Europe Summer Time (UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna (+01:00 DST)
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
[system.threading.thread]::currentThread.currentCulture = [system.globalization.cultureInfo]"en-US"
|
||||
$Time = $((Get-Date).ToShortTimeString())
|
||||
$TZ = (Get-Timezone)
|
||||
if ($TZ.SupportsDaylightSavingTime) {
|
||||
$TZName = $TZ.DaylightName
|
||||
$DST=" (+01:00 DST)"
|
||||
} else {
|
||||
$TZName = $TZ.StandardName
|
||||
$DST=""
|
||||
}
|
||||
Write-Host "✅ $Time $TZName $($TZ.DisplayName)$($DST)"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
42
scripts/check-uptime.ps1
Executable file
42
scripts/check-uptime.ps1
Executable file
@ -0,0 +1,42 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the uptime
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the computer's uptime (time between now and last boot up time) and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-uptime.ps1
|
||||
✅ Up for 2 days, 20 hours, 10 minutes
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
function TimeSpan2String([TimeSpan]$uptime)
|
||||
{
|
||||
[int]$days = $uptime.Days
|
||||
[int]$hours = $days * 24 + $uptime.Hours
|
||||
if ($days -gt 2) {
|
||||
return "$days days"
|
||||
} elseif ($hours -gt 1) {
|
||||
return "$hours hours"
|
||||
} else {
|
||||
return "$($uptime.Minutes)min"
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
if ($IsLinux) {
|
||||
$uptime = (Get-Uptime)
|
||||
Write-Host "✅ Up for $(TimeSpan2String $uptime)"
|
||||
} else {
|
||||
[system.threading.thread]::currentthread.currentculture = [system.globalization.cultureinfo]"en-US"
|
||||
$lastBootTime = (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
|
||||
$uptime = New-TimeSpan -Start $lastBootTime -End (Get-Date)
|
||||
Write-Host "✅ Up for $(TimeSpan2String $uptime) since $($lastBootTime.ToShortDateString())"
|
||||
}
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
31
scripts/check-vpn.ps1
Executable file
31
scripts/check-vpn.ps1
Executable file
@ -0,0 +1,31 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the VPN status
|
||||
.DESCRIPTION
|
||||
This PowerShell script queries the status of the VPN connection(s) and prints it.
|
||||
.EXAMPLE
|
||||
PS> ./check-vpn.ps1
|
||||
✅ VPN to NASA L2TP is connected
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$noVPN = $true
|
||||
if ($IsLinux) {
|
||||
# TODO
|
||||
} else {
|
||||
$Connections = Get-VPNConnection
|
||||
foreach($Connection in $Connections) {
|
||||
Write-Host "✅ VPN to $($Connection.Name) is $($Connection.ConnectionStatus.ToLower())"
|
||||
$noVPN = $false
|
||||
}
|
||||
}
|
||||
if ($noVPN) { Write-Host "⚠️ No VPN configured" }
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
39
scripts/check-weather.ps1
Executable file
39
scripts/check-weather.ps1
Executable file
@ -0,0 +1,39 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the weather
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the current weather report.
|
||||
.PARAMETER location
|
||||
Specifies the location to use (determined automatically per default)
|
||||
.EXAMPLE
|
||||
PS> ./check-weather.ps1
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$location = "") # empty means determine automatically
|
||||
|
||||
try {
|
||||
$Weather = (Invoke-WebRequest http://wttr.in/${location}?format=j1 -userAgent "curl" -useBasicParsing).Content | ConvertFrom-Json
|
||||
|
||||
$Temp = $Weather.current_condition.temp_C
|
||||
$Precip = $Weather.current_condition.precipMM
|
||||
$Humidity = $Weather.current_condition.humidity
|
||||
$Pressure = $Weather.current_condition.pressure
|
||||
$WindSpeed = $Weather.current_condition.windspeedKmph
|
||||
$WindDir = $Weather.current_condition.winddir16Point
|
||||
$UV = $Weather.current_condition.uvIndex
|
||||
$Visib = $Weather.current_condition.visibility
|
||||
$Clouds = $Weather.current_condition.cloudcover
|
||||
$Desc = $Weather.current_condition.weatherDesc.value
|
||||
$Area = $Weather.nearest_area.areaName.value
|
||||
$Region = $Weather.nearest_area.region.value
|
||||
|
||||
& "$PSScriptRoot/speak-english.ps1" "$($Temp)°C, $($Precip)mm rain, $($Humidity)% humidity, $($WindSpeed)km/h wind from $WindDir with $($Clouds)% clouds and $($Visib)km visibility at $Area ($Region)."
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
21
scripts/check-week.ps1
Executable file
21
scripts/check-week.ps1
Executable file
@ -0,0 +1,21 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Determines the week number
|
||||
.DESCRIPTION
|
||||
This PowerShell script determines and speaks the current week number by text-to-speech (TTS).
|
||||
.EXAMPLE
|
||||
PS> ./check-week.ps1
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$WeekNo = (Get-Date -UFormat %V)
|
||||
& "$PSScriptRoot/speak-english.ps1" "It's week #$WeekNo."
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
30
scripts/check-wind.ps1
Executable file
30
scripts/check-wind.ps1
Executable file
@ -0,0 +1,30 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the wind conditions
|
||||
.DESCRIPTION
|
||||
This PowerShell script determines the current wind conditions and replies by text-to-speech (TTS).
|
||||
.PARAMETER location
|
||||
Specifies the location to use (determined automatically per default)
|
||||
.EXAMPLE
|
||||
PS> ./check-wind.ps1
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$location = "") # empty means determine automatically
|
||||
|
||||
try {
|
||||
$Weather = (Invoke-WebRequest http://wttr.in/${location}?format=j1 -userAgent "curl" -useBasicParsing).Content | ConvertFrom-Json
|
||||
$WindSpeed = $Weather.current_condition.windspeedKmph
|
||||
$WindDir = $Weather.current_condition.winddir16Point
|
||||
$Area = $Weather.nearest_area.areaName.value
|
||||
$Region = $Weather.nearest_area.region.value
|
||||
|
||||
& "$PSScriptRoot/speak-english.ps1" "$($WindSpeed)km/h wind from $WindDir at $Area ($Region)."
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
26
scripts/check-windows-system-files.ps1
Executable file
26
scripts/check-windows-system-files.ps1
Executable file
@ -0,0 +1,26 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the validity of the Windows system files (requires admin rights)
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the validity of the Windows system files. It requires admin rights.
|
||||
.EXAMPLE
|
||||
PS> ./check-windows-system-files.ps1
|
||||
✔️ checked Windows system files
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
#Requires -RunAsAdministrator
|
||||
|
||||
try {
|
||||
sfc /verifyOnly
|
||||
if ($lastExitCode -ne "0") { throw "'sfc /verifyOnly' failed" }
|
||||
|
||||
"✔️ checked Windows system files"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
45
scripts/check-xml-file.ps1
Executable file
45
scripts/check-xml-file.ps1
Executable file
@ -0,0 +1,45 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Checks the given XML file for validity
|
||||
.DESCRIPTION
|
||||
This PowerShell script checks the given XML file for validity.
|
||||
.PARAMETER file
|
||||
Specifies the path to the XML file to check
|
||||
.EXAMPLE
|
||||
PS> ./check-xml-file myfile.xml
|
||||
✔️ XML file is valid
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$file = "")
|
||||
|
||||
try {
|
||||
if ($file -eq "" ) { $file = read-host "Enter path to XML file" }
|
||||
|
||||
$XmlFile = Get-Item $file
|
||||
|
||||
$script:ErrorCount = 0
|
||||
|
||||
# Perform the XSD Validation
|
||||
$ReaderSettings = New-Object -TypeName System.Xml.XmlReaderSettings
|
||||
$ReaderSettings.ValidationType = [System.Xml.ValidationType]::Schema
|
||||
$ReaderSettings.ValidationFlags = [System.Xml.Schema.XmlSchemaValidationFlags]::ProcessInlineSchema -bor [System.Xml.Schema.XmlSchemaValidationFlags]::ProcessSchemaLocation
|
||||
$ReaderSettings.add_ValidationEventHandler({ $script:ErrorCount++ })
|
||||
$Reader = [System.Xml.XmlReader]::Create($XmlFile.FullName, $ReaderSettings)
|
||||
while ($Reader.Read()) { }
|
||||
$Reader.Close()
|
||||
|
||||
if ($script:ErrorCount -gt 0) {
|
||||
write-warning "Invalid XML file"
|
||||
exit 1
|
||||
}
|
||||
|
||||
"✔️ XML file is valid"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
53
scripts/clean-repo.ps1
Executable file
53
scripts/clean-repo.ps1
Executable file
@ -0,0 +1,53 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Cleans a repo
|
||||
.DESCRIPTION
|
||||
This PowerShell script deletes all untracked files and folders in a local Git repository (including submodules).
|
||||
NOTE: To be used with care! This cannot be undone!
|
||||
.PARAMETER RepoDir
|
||||
Specifies the file path to the local Git repository
|
||||
.EXAMPLE
|
||||
PS> ./clean-repo.ps1 C:\rust
|
||||
⏳ (1/4) Searching for Git executable... git version 2.41.0.windows.3
|
||||
⏳ (2/4) Checking local repository... 📂C:\rust
|
||||
⏳ (3/4) Removing untracked files in repository...
|
||||
⏳ (4/4) Removing untracked files in submodules...
|
||||
✔️ Cleaned repo 📂rust in 1 sec
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$RepoDir = "$PWD")
|
||||
|
||||
try {
|
||||
$StopWatch = [system.diagnostics.stopwatch]::startNew()
|
||||
|
||||
Write-Host "⏳ (1/4) Searching for Git executable... " -noNewline
|
||||
& git --version
|
||||
if ($lastExitCode -ne "0") { throw "Can't execute 'git' - make sure Git is installed and available" }
|
||||
|
||||
"⏳ (2/4) Checking local repository... 📂$RepoDir"
|
||||
if (-not(Test-Path "$RepoDir" -pathType container)) { throw "Can't access folder '$RepoDir' - maybe a typo or missing folder permissions?" }
|
||||
$RepoDirName = (Get-Item "$RepoDir").Name
|
||||
|
||||
"⏳ (3/4) Removing untracked files in repository..."
|
||||
& git -C "$RepoDir" clean -xfd -f # to delete all untracked files in the main repo
|
||||
if ($lastExitCode -ne "0") {
|
||||
Write-Warning "'git clean' failed with exit code $lastExitCode, retrying once..."
|
||||
& git -C "$RepoDir" clean -xfd -f
|
||||
if ($lastExitCode -ne "0") { throw "'git clean' failed with exit code $lastExitCode" }
|
||||
}
|
||||
|
||||
"⏳ (4/4) Removing untracked files in submodules..."
|
||||
& git -C "$RepoDir" submodule foreach --recursive git clean -xfd -f # to delete all untracked files in the submodules
|
||||
if ($lastExitCode -ne "0") { throw "'git clean' in the submodules failed with exit code $lastExitCode" }
|
||||
|
||||
[int]$Elapsed = $StopWatch.Elapsed.TotalSeconds
|
||||
"✔️ Cleaned repo 📂$RepoDirName in $Elapsed sec"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
54
scripts/clean-repos.ps1
Executable file
54
scripts/clean-repos.ps1
Executable file
@ -0,0 +1,54 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Cleans all Git repositories in a folder from untracked files
|
||||
.DESCRIPTION
|
||||
This PowerShell script cleans all Git repositories in a folder from untracked files (including submodules).
|
||||
.PARAMETER parentDir
|
||||
Specifies the path to the parent folder (current working dir by default)
|
||||
.EXAMPLE
|
||||
PS> ./clean-repos.ps1 C:\MyRepos
|
||||
⏳ (1) Searching for Git executable... git version 2.40.1
|
||||
⏳ (2) Checking parent folder 📂Repos... 28 subfolders found
|
||||
⏳ (3/30) Cleaning 📂base256unicode...
|
||||
...
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$parentDir = "$PWD")
|
||||
|
||||
try {
|
||||
$stopWatch = [system.diagnostics.stopwatch]::startNew()
|
||||
|
||||
Write-Host "⏳ (1) Searching for Git executable... " -noNewline
|
||||
& git --version
|
||||
if ($lastExitCode -ne "0") { throw "Can't execute 'git' - make sure Git is installed and available" }
|
||||
|
||||
$parentDirName = (Get-Item "$ParentDir").Name
|
||||
Write-Host "⏳ (2) Checking parent folder 📂$parentDirName... " -noNewline
|
||||
if (-not(Test-Path "$ParentDir" -pathType container)) { throw "Can't access folder: $ParentDir" }
|
||||
$folders = (Get-ChildItem "$ParentDir" -attributes Directory)
|
||||
$numFolders = $folders.Count
|
||||
Write-Host "$numFolders subfolders found"
|
||||
|
||||
[int]$Step = 2
|
||||
foreach ($folder in $folders) {
|
||||
$FolderName = (Get-Item "$folder").Name
|
||||
$Step++
|
||||
"⏳ ($Step/$($numFolders + 2)) Cleaning 📂$FolderName..."
|
||||
|
||||
& git -C "$folder" clean -xfd -f # force + recurse into dirs + don't use the standard ignore rules
|
||||
if ($lastExitCode -ne "0") { throw "'git clean -xfd -f' failed with exit code $lastExitCode" }
|
||||
|
||||
& git -C "$folder" submodule foreach --recursive git clean -xfd -f
|
||||
if ($lastExitCode -ne "0") { throw "'git clean -xfd -f' in submodules failed with exit code $lastExitCode" }
|
||||
}
|
||||
[int]$elapsed = $stopWatch.Elapsed.TotalSeconds
|
||||
"✔️ Cleaned $numFolders Git repos under 📂$parentDirName in $elapsed sec"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
26
scripts/clear-dns-cache.ps1
Executable file
26
scripts/clear-dns-cache.ps1
Executable file
@ -0,0 +1,26 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Clears the DNS cache
|
||||
.DESCRIPTION
|
||||
This PowerShell script clears the DNS client cache of the local computer.
|
||||
.EXAMPLE
|
||||
PS> ./clear-dns-cache.ps1
|
||||
✔️ Cleared DNS cache in 1 sec
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
$StopWatch = [system.diagnostics.stopwatch]::startNew()
|
||||
|
||||
Clear-DnsClientCache
|
||||
|
||||
[int]$Elapsed = $StopWatch.Elapsed.TotalSeconds
|
||||
"✔️ Cleared DNS cache in $Elapsed sec"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
24
scripts/clear-recycle-bin.ps1
Executable file
24
scripts/clear-recycle-bin.ps1
Executable file
@ -0,0 +1,24 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Clears the recycle bin folder
|
||||
.DESCRIPTION
|
||||
This PowerShell script removes the content of the recycle bin folder permanently.
|
||||
IMPORTANT NOTE: this cannot be undo!
|
||||
.EXAMPLE
|
||||
PS> ./clear-recycle-bin
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
try {
|
||||
Clear-RecycleBin -Confirm:$false
|
||||
if ($lastExitCode -ne "0") { throw "'Clear-RecycleBin' failed" }
|
||||
|
||||
& "$PSScriptRoot/speak-english.ps1" "It's clean now."
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
69
scripts/clone-repos.ps1
Executable file
69
scripts/clone-repos.ps1
Executable file
@ -0,0 +1,69 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Clones Git repos
|
||||
.DESCRIPTION
|
||||
This PowerShell script clones popular Git repositories into a common target directory.
|
||||
.PARAMETER targetDir
|
||||
Specifies the file path to the target directory (current working directory by default)
|
||||
.EXAMPLE
|
||||
PS> ./clone-repos C:\Repos
|
||||
...
|
||||
✔️ Cloned 29 of 29 Git repos into 📂C:\Repos in 123 sec
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
param([string]$targetDir = "$PWD")
|
||||
|
||||
try {
|
||||
$stopWatch = [system.diagnostics.stopwatch]::startNew()
|
||||
|
||||
Write-Host "⏳ (1) Searching for Git executable... " -noNewline
|
||||
& git --version
|
||||
if ($lastExitCode -ne "0") { throw "Can't execute 'git' - make sure Git is installed and available" }
|
||||
|
||||
Write-Host "⏳ (2) Reading Data/popular-repositories.csv... " -noNewline
|
||||
$table = Import-CSV "$PSScriptRoot/../data/popular-repositories.csv"
|
||||
$total = $table.count
|
||||
Write-Host "$total repos"
|
||||
|
||||
$targetDirName = (Get-Item "$targetDir").Name
|
||||
Write-Host "⏳ (3) Checking target folder... 📂$targetDirName"
|
||||
if (-not(Test-Path "$targetDir" -pathType container)) { throw "Can't access directory: $targetDir" }
|
||||
|
||||
[int]$step = 3
|
||||
[int]$cloned = 0
|
||||
[int]$skipped = 0
|
||||
foreach($row in $table) {
|
||||
[string]$folderName = $row.FOLDERNAME
|
||||
[string]$category = $row.CATEGORY
|
||||
[string]$URL = $row.URL
|
||||
[string]$branch = $row.BRANCH
|
||||
[string]$shallow = $row.SHALLOW
|
||||
$step++
|
||||
|
||||
if (Test-Path "$targetDir/$folderName" -pathType container) {
|
||||
"⏳ ($step/$($total + 4)) Skipping existing 📂$folderName ($category)..."
|
||||
$skipped++
|
||||
continue
|
||||
}
|
||||
if ($shallow -eq "yes") {
|
||||
"⏳ ($step/$($total + 4)) Cloning into 📂$folderName (a $category, $branch branch, shallow)..."
|
||||
& git clone --branch "$branch" --single-branch --recurse-submodules "$URL" "$targetDir/$folderName"
|
||||
if ($lastExitCode -ne "0") { throw "'git clone --branch $branch $URL' failed with exit code $lastExitCode" }
|
||||
} else {
|
||||
"⏳ ($step/$($total + 4)) Cloning into 📂$folderName (a $category, $branch branch, full history)..."
|
||||
& git clone --branch "$branch" --recurse-submodules "$URL" "$targetDir/$folderName"
|
||||
if ($lastExitCode -ne "0") { throw "'git clone --branch $branch $URL' failed with exit code $lastExitCode" }
|
||||
}
|
||||
$cloned++
|
||||
}
|
||||
[int]$elapsed = $stopWatch.Elapsed.TotalSeconds
|
||||
"✔️ Cloned $cloned of $total Git repos into 📂$targetDirName in $Elapsed sec"
|
||||
exit 0 # success
|
||||
} catch {
|
||||
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
|
||||
exit 1
|
||||
}
|
15
scripts/close-calculator.ps1
Executable file
15
scripts/close-calculator.ps1
Executable file
@ -0,0 +1,15 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Closes the calculator application
|
||||
.DESCRIPTION
|
||||
This PowerShell script closes the calculator application gracefully.
|
||||
.EXAMPLE
|
||||
PS> ./close-calculator
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
Stop-Process -name "CalculatorApp"
|
||||
exit 0 # success
|
15
scripts/close-chrome.ps1
Executable file
15
scripts/close-chrome.ps1
Executable file
@ -0,0 +1,15 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Closes the Chrome browser
|
||||
.DESCRIPTION
|
||||
This PowerShell script closes the Google Chrome Web browser gracefully.
|
||||
.EXAMPLE
|
||||
PS> ./close-chrome
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
& "$PSScriptRoot/close-program.ps1" "Google Chrome" "chrome" "chrome"
|
||||
exit 0 # success
|
15
scripts/close-cortana.ps1
Executable file
15
scripts/close-cortana.ps1
Executable file
@ -0,0 +1,15 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Closes Microsoft's Cortana application
|
||||
.DESCRIPTION
|
||||
This PowerShell script closes Microsoft's Cortana application gracefully.
|
||||
.EXAMPLE
|
||||
PS> ./close-cortana
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
& "$PSScriptRoot/close-program.ps1" "Cortana" "Cortana" "Cortana"
|
||||
exit 0 # success
|
19
scripts/close-edge.ps1
Executable file
19
scripts/close-edge.ps1
Executable file
@ -0,0 +1,19 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Closes the Edge browser
|
||||
.DESCRIPTION
|
||||
This PowerShell script closes the Microsoft Edge Web browser gracefully.
|
||||
.EXAMPLE
|
||||
PS> ./close-edge
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
TaskKill /im msedge.exe /f /t
|
||||
if ($lastExitCode -ne "0") {
|
||||
& "$PSScriptRoot/speak-english.ps1" "Sorry, Microsoft Edge isn't running."
|
||||
exit 1
|
||||
}
|
||||
exit 0 # success
|
15
scripts/close-file-explorer.ps1
Executable file
15
scripts/close-file-explorer.ps1
Executable file
@ -0,0 +1,15 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Closes the File Explorer
|
||||
.DESCRIPTION
|
||||
This PowerShell script closes the Microsoft File Explorer application gracefully.
|
||||
.EXAMPLE
|
||||
PS> ./close-file-explorer
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
(New-Object -ComObject Shell.Application).Windows() | %{$_.quit()}
|
||||
exit 0 # success
|
15
scripts/close-firefox.ps1
Executable file
15
scripts/close-firefox.ps1
Executable file
@ -0,0 +1,15 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Closes the Firefox browser
|
||||
.DESCRIPTION
|
||||
This PowerShell script closes the Mozilla Firefox Web browser gracefully.
|
||||
.EXAMPLE
|
||||
PS> ./close-firefox
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
& "$PSScriptRoot/close-program.ps1" "Mozilla Firefox" "firefox" "firefox"
|
||||
exit 0 # success
|
19
scripts/close-git-extensions.ps1
Executable file
19
scripts/close-git-extensions.ps1
Executable file
@ -0,0 +1,19 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Closes the Git Extensions app
|
||||
.DESCRIPTION
|
||||
This PowerShell script closes the Git Extensions application gracefully.
|
||||
.EXAMPLE
|
||||
PS> ./close-git-extensions.ps1
|
||||
.LINK
|
||||
https://github.com/fleschutz/PowerShell
|
||||
.NOTES
|
||||
Author: Markus Fleschutz | License: CC0
|
||||
#>
|
||||
|
||||
TaskKill /im GitExtensions.exe
|
||||
if ($lastExitCode -ne "0") {
|
||||
& "$PSScriptRoot/speak-english.ps1" "Sorry, Git Extensions isn't running."
|
||||
exit 1
|
||||
}
|
||||
exit 0 # success
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user