Renamed folder Scripts to scripts

This commit is contained in:
Markus Fleschutz
2023-10-31 11:32:46 +01:00
parent f826630e72
commit 66af9a5668
598 changed files with 304 additions and 304 deletions

49
scripts/Windefender.ps1 Executable file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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

View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
}

View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
}

View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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

View 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