Skip to content

Instantly share code, notes, and snippets.

View joshooaj's full-sized avatar

Josh Hendricks joshooaj

View GitHub Profile
@joshooaj
joshooaj / watch-diskfreespace.ps1
Last active March 18, 2025 19:08
Call the GetDiskFreeSpaceExW function from PowerShell using p/invoke
<#
.SYNOPSIS
Gets the free space on a disk and waits 500ms or for a specified delay before checking again.
.DESCRIPTION
This function uses p/invoke to call the GetDiskFreeSpaceEx function from the kernel32.dll library to get the free
space on a disk based on the path provided. It will keep checking the free space at the specified interval, or 500ms
by default, until an error occurs.
When an error occurs, the function will include the output of GetLastError and the string-formatted
@joshooaj
joshooaj / convert.ps1
Last active January 22, 2025 23:08
Convert all video in one or more XProtect database to mkv files
#require -Modules MilestonePSTools, MilestoneSystems.PowerShell.MediaDB
param(
# Specifies the path to a folder containing one or more XProtect media database folders.
[Parameter()]
[string]
$Source,
# Specifies the path to a folder where MKV files will be saved.
[Parameter()]
[string]
@joshooaj
joshooaj / parallel-exports.ps1
Created January 13, 2025 20:35
Export recording sequences in parallel
#requires -Modules Microsoft.PowerShell.ThreadJob
<#
This is an example of how you could parallelize exports. You _probably_ wouldn't do this specific thing in practice
but it was an easy proof of concept on a small system.
The following script will get all enabled cameras, and then get all recording sequences for todays date, and then
using the Start-ThreadJob command, it will run each export in a separate job, saving each recording sequence found
on each enabled camera to it's own MKV file in the C:\temp directory.
#>
@joshooaj
joshooaj / New-RandomPass.ps1
Last active December 10, 2024 23:31 — forked from steviecoaster/New-RandomPass.ps1
Cross platform password generator
function New-RandomPass {
<#
.Synopsis
Generates and returns a suitably secure password
.EXAMPLE
New-RandomPass
Returns a random password as a SecureString object
.EXAMPLE
@joshooaj
joshooaj / ParsePng.ps1
Created December 3, 2024 21:30
Parse PNG files into their individual chunks
function ParsePng {
[CmdletBinding()]
param(
[Parameter(Mandatory, Position = 0)]
[string]
$Path
)
process {
try {
@joshooaj
joshooaj / New-QueryString.ps1
Last active November 25, 2024 22:52 — forked from steviecoaster/New-QueryString.ps1
Creates a querystring to use with an API call
function New-QueryString {
<#
.SYNOPSIS
Turn a hashtable into a URI querystring
.DESCRIPTION
Turn a hashtable into a URI querystring
.PARAMETER QueryParameter
The hashtable to transform
@joshooaj
joshooaj / Send-VmsDriverCommand.ps1
Last active March 30, 2025 23:11
Send custom driver commands to XProtect
function Send-VmsDriverCommand {
<#
.SYNOPSIS
Sends a custom HTTP request or command to a device added to an XProtect VMS.
.PARAMETER Camera
Specifies the camera to which the driver command should be sent.
.PARAMETER Fqid
Specifies the FQID associated with the destination device. Try `Get-VmsVideoOSItem` to retrieve an item, and then
@joshooaj
joshooaj / Get-MilestoneDownloadsList.ps1
Last active May 8, 2025 16:36
Gets a list of Milestone downloads
function Get-MilestoneDownloadsList {
<#
.SYNOPSIS
Gets a list of blobs stored at https://milestonedownload.blob.core.windows.net/files
.PARAMETER Prefix
Specifies an optional blob name prefix like 'Hotfixes', or 'Hotfixes/24.1'
.EXAMPLE
$blobs = Get-MilestoneDownloadsList -Prefix 'Hotfixes/24.1'
@joshooaj
joshooaj / Show-DateTimePicker.ps1
Last active October 1, 2024 20:48
Simple datetime picker ui implementation for Windows PowerShell
function Show-DateTimePicker {
[CmdletBinding()]
param(
[Parameter()]
[string]
$Title = 'Show-DateTimePicker',
[Parameter()]
[DateTimeKind]
$Kind = [DateTimeKind]::Local
@joshooaj
joshooaj / Get-CamerasThatArentInAView.ps1
Last active September 12, 2024 23:14
Discover cameras that are NOT in a view
function Get-CamerasThatArentInAView {
[CmdletBinding()]
param ()
process {
$camerasInViews = @{}
$publicViewGroups = Get-VmsViewGroup | Where-Object Name -ne 'Private'
$views = $publicViewGroups | Get-VmsViewGroup -Recurse | Get-VmsView
foreach ($view in $views) {