From 757f1775ffb5f8ab7ab619f0934e0d10091a7223 Mon Sep 17 00:00:00 2001 From: Princess Pi Date: Fri, 25 Sep 2026 15:43:25 -0600 Subject: [PATCH] waypoit debuguing --- Windows-Scripts/checksum.ps1 | 180 +++++++++++++++++++++-------------- 1 file changed, 107 insertions(+), 73 deletions(-) diff --git a/Windows-Scripts/checksum.ps1 b/Windows-Scripts/checksum.ps1 index 16d14b0..cc6a393 100644 --- a/Windows-Scripts/checksum.ps1 +++ b/Windows-Scripts/checksum.ps1 @@ -5,40 +5,40 @@ param( [Parameter(Position = 0, ParameterSetName = 'Match', ValueFromPipeline = $true)] [string[]]$FilePath, - # Output file switch (-o) - auto generates file based on rules + # Output file switch (-o / --out) - auto generates file based on rules [Parameter(Mandatory = $false, ParameterSetName = 'Generate')] - [Alias('o', 'out')] + [Alias('o', 'out', 'SaveToFile')] [switch]$SaveToFile, - # Custom Output file name (-f / -OutFile) + # Custom Output file name (-f / --outfile) [Parameter(Mandatory = $false, ParameterSetName = 'Generate')] - [Alias('f')] + [Alias('f', 'outfile')] [string]$OutFile, - # File containing checksums to verify (-c / -Check) + # File containing checksums to verify (-c / --check) [Parameter(Mandatory = $false, ParameterSetName = 'Verify')] - [Alias('c')] + [Alias('c', 'check')] [string]$Check, - # Direct checksum hash string to match against (-m / -Match) + # Direct checksum hash string to match against (-m / --match) [Parameter(Mandatory = $true, ParameterSetName = 'Match')] - [Alias('m')] + [Alias('m', 'match')] [string]$Match, # Hashing algorithm to use (Defaults to SHA256) [Parameter(Mandatory = $false)] - [Alias('a', 'algo')] + [Alias('a', 'algo', 'algorithm')] [ValidateSet('SHA1', 'SHA256', 'SHA384', 'SHA512', 'MD5')] [string]$Algorithm, - # Recursive flag (-r / -Recursive) + # Recursive flag (-r / --recursive) [Parameter(Mandatory = $false)] - [Alias('r')] + [Alias('r', 'recursive')] [switch]$Recursive, - # Help flag (-h / -Help) + # Help flag (-h / --help) [Parameter(Mandatory = $false)] - [Alias('h')] + [Alias('h', 'help')] [switch]$Help ) @@ -55,51 +55,59 @@ SYNOPSIS .\checksum.ps1 -Help DESCRIPTION - Computes or verifies checksums using various cryptographic algorithms. - Outputs hash values in standard Linux utility format ( ). - Ignores checksum files (.md5, .sha1, .sha256, .sha384, .sha512) unless explicitly passed. + Computes or verifies checksums using cryptographic hash algorithms (SHA256, SHA512, SHA1, MD5, SHA384). + Outputs hash values in standard GNU coreutils format ( ). + Supports both single-dash (-o, -c, -r) and double-dash (--out, --check, --recursive) GNU-style flags. + Ignores checksum metadata files (.md5, .sha1, .sha256, .sha384, .sha512) during wildcards unless passed explicitly. PARAMETERS -FilePath - Specifies the path to one or more files to hash. Accepts wildcards (*). + Specifies the target file(s) or wildcard pattern (*). - -o, -Out, --Out - Enables writing checksum results to an auto-named file. - - If input has a wildcard (*), outputs to 'checksums.' - - If no wildcard is used, outputs to '.' per file. - When combined with -r and *, it auto-generates checksum files - inside the current working directory and each subdirectory recursively. + -o, --out, -SaveToFile + Enables auto-saving checksum results to file(s). + - If input contains a wildcard (*), writes to 'checksums.'. + - If an explicit file is given, writes to '.'. + When combined with -r and *, recursively auto-generates checksum files per directory. - -f, -OutFile, --OutFile - Specifies an explicit output file name to save results to. + -f, --outfile, -OutFile + Specifies an explicit destination filename for saving checksum output. - -r, -Recursive, --Recursive - Recursively generate or verify checksums in subdirectories. + -c, --check, -Check + Reads hashes from a specified checksum file and verifies target files on disk. + If -r is specified, recursively looks for and validates checksum files by name across subdirectories. - -c, -Check, --Check - Read checksums from the specified file and verify them against files on disk. - If -r is used, searches for the specified filename recursively in subdirectories. + -m, --match, -Match + Compares the computed hash of target file(s) directly against a given hash string. - -m, -Match, --Match - Compare the computed hash of the target file(s) against a specific hash string. + -a, --algo, --algorithm, -Algorithm + Specifies the hash algorithm to use. + Supported options: SHA1, SHA256 (default), SHA384, SHA512, MD5. + In -c or -m mode, auto-detects algorithm from hash length if omitted. - -a, -Algorithm, --Algorithm - Specifies the cryptographic hash algorithm to use. - Supported values: SHA1, SHA256 (default), SHA384, SHA512, MD5. - If omitted in -c or -m mode, the algorithm is auto-detected by hash length. + -r, --recursive, -Recursive + Processes target files or verification files recursively across directory structures. - -h, -Help, --Help - Display this help message. + -h, --help, -Help + Displays this help documentation. EXAMPLES - 1. Compute SHA256 checksum for a single file: + 1. Compute SHA256 for a single file: .\checksum.ps1 myfile.iso - 2. Compute checksums for all files and auto-write to files (-o flag): - .\checksum.ps1 * -r -o + 2. Compute SHA512 checksums recursively and auto-save: + .\checksum.ps1 * -r -o -a SHA512 + .\checksum.ps1 * --recursive --out --algo SHA512 - 3. Verify checksums from verification files recursively: - .\checksum.ps1 -c checksums.sha256 -r + 3. Verify checksums against a verification file: + .\checksum.ps1 -c checksums.sha256 + .\checksum.ps1 --check checksums.sha256 + + 4. Recursively verify checksum files across subdirectories: + .\checksum.ps1 --check checksums.sha256 --recursive + + 5. Compare file directly against an expected hash string: + .\checksum.ps1 myfile.bin --match 406653a68bd3538975656831f33f031b '@ }; @@ -124,7 +132,7 @@ process { $helpInPath =$false; if ($FilePath) { foreach ($p in ($FilePath)) { - if ($p -match '^(?i)[-/]{1,2}(h\vert{}help)$') { + if ($p -match '^(?i)[-/]{1,2}(h\vert{}help\vert{}\?)$') { $helpInPath =$true; break; } @@ -189,7 +197,7 @@ process { }; }; - # --- DIRECT MATCH MODE (-m / -Match) --- + # --- DIRECT MATCH MODE (-m / --match) --- if ($PSCmdlet.ParameterSetName -eq 'Match') { if ([string]::IsNullOrWhiteSpace($Algorithm)) { $Algorithm = Get-AlgorithmFromHashLength -HashString ($Match); @@ -202,7 +210,7 @@ process { $actualHash = (Get-FileHash -Path ($item.FullName) -Algorithm ($Algorithm)).Hash.ToLower(); $targetFile = Resolve-Path -Path ($item.FullName) -Relative -ErrorAction 'SilentlyContinue'; if (-not $targetFile) { $targetFile = $item.Name; }; - if ($targetFile.StartsWith(".\")) { $targetFile = $targetFile.Substring(2); }; + if ($targetFile.StartsWith(".\") -or $targetFile.StartsWith("./")) { $targetFile = $targetFile.Substring(2); }; if ($actualHash -eq $expectedHash) { Write-Host "${targetFile}: " -NoNewline; @@ -213,7 +221,7 @@ process { }; }; } - # --- VERIFICATION MODE (-c / -Check) --- + # --- VERIFICATION MODE (-c / --check) --- elseif ($PSCmdlet.ParameterSetName -eq 'Verify') { $checkFiles = @(); if ($Recursive) { @@ -238,10 +246,15 @@ process { if ([string]::IsNullOrWhiteSpace($fileAlgo)) { foreach ($line in ($lines)) { if ([string]::IsNullOrWhiteSpace($line) -or$line.StartsWith("#")) { continue; }; + if ($line -match '^([a-fA-F0-9]+)\s+') { $fileAlgo = Get-AlgorithmFromHashLength -HashString ($Matches[1]); break; } + elseif ($line -match '^([a-fA-F0-9]{128}|[a-fA-F0-9]{96}|[a-fA-F0-9]{64}|[a-fA-F0-9]{40}|[a-fA-F0-9]{32})') { + $fileAlgo = Get-AlgorithmFromHashLength -HashString ($Matches[1]); + break; + } }; if ([string]::IsNullOrWhiteSpace($fileAlgo)) {$fileAlgo = 'SHA256'; }; }; @@ -249,13 +262,27 @@ process { foreach ($line in ($lines)) { if ([string]::IsNullOrWhiteSpace($line) -or$line.StartsWith("#")) { continue; }; - if ($line -match '^([a-fA-F0-9]+)\s+[* ]?(.*)$') {$expectedHash = $Matches[1].ToLower();$targetFile = $Matches[2].Trim().TrimStart('*');$targetFullPath = Join-Path -Path ($baseDir) -ChildPath ($targetFile); + $expectedHash =$null; + $targetFile =$null; + + # Standard GNU checksum format: + if ($line -match '^([a-fA-F0-9]+)\s+[* ]?(.*)$') { + $expectedHash =$Matches[1].ToLower(); + $targetFile =$Matches[2].Trim().TrimStart('*'); + } + # Fallback for unspaced files: + elseif ($line -match '^([a-fA-F0-9]{128}\vert{}[a-fA-F0-9]{96}\vert{}[a-fA-F0-9]{64}\vert{}[a-fA-F0-9]{40}\vert{}[a-fA-F0-9]{32})[* ]?(.*)$') { + $expectedHash =$Matches[1].ToLower(); + $targetFile =$Matches[2].Trim().TrimStart('*'); + }; + + if ($expectedHash -and $targetFile) {$targetFullPath = Join-Path -Path ($baseDir) -ChildPath ($targetFile); if (Test-Path -Path ($targetFullPath) -PathType 'Leaf') {$actualHash = (Get-FileHash -Path ($targetFullPath) -Algorithm ($fileAlgo)).Hash.ToLower(); $displayPath = Resolve-Path -Path ($targetFullPath) -Relative -ErrorAction 'SilentlyContinue'; if (-not $displayPath) { $displayPath =$targetFile; }; - if ($displayPath.StartsWith(".\")) { $displayPath =$displayPath.Substring(2); }; + if ($displayPath.StartsWith(".\") -or $displayPath.StartsWith("./")) { $displayPath =$displayPath.Substring(2); }; if ($actualHash -eq$expectedHash) { Write-Host "${displayPath}: " -NoNewline; @@ -267,7 +294,7 @@ process { } else { $displayPath =$targetFile; if ($baseDir -ne (Get-Location).Path) {$displayPath = Join-Path -Path (Resolve-Path -Path ($baseDir) -Relative -ErrorAction 'SilentlyContinue') -ChildPath ($targetFile); - if ($displayPath.StartsWith(".\")) { $displayPath =$displayPath.Substring(2); }; + if ($displayPath.StartsWith(".\") -or $displayPath.StartsWith("./")) { $displayPath =$displayPath.Substring(2); }; }; Write-Host "${displayPath}: " -NoNewline; Write-Host "FAILED open or read" -ForegroundColor Red; @@ -297,15 +324,16 @@ process { $currentOutFile = Join-Path -Path ($dirPath) -ChildPath ($OutFile); }; - $null = New-Item -Path ($currentOutFile) -ItemType 'File' -Force; - + $linesToWrite = @(); foreach ($item in ($filesInDir)) {$hash = (Get-FileHash -Path ($item.FullName) -Algorithm ($Algorithm)).Hash.ToLower(); $relativePath =$item.Name; - $outputLine = "$hash$relativePath"; - Add-Content -Path ($currentOutFile) -Value ($outputLine); + $outputLine = "${hash}${relativePath}"; + $linesToWrite +=$outputLine; Write-Output $outputLine; }; + + Set-Content -Path ($currentOutFile) -Value$linesToWrite -Encoding utf8; }; } else { @@ -318,29 +346,35 @@ process { $singleOutFile =$OutFile; }; - if ($singleOutFile) { - $null = New-Item -Path ($singleOutFile) -ItemType 'File' -Force; - }; + if ($singleOutFile) {$linesToWrite = @(); + foreach ($item in ($allItems)) {$hash = (Get-FileHash -Path ($item.FullName) -Algorithm ($Algorithm)).Hash.ToLower(); + + $relativePath = Resolve-Path -Path ($item.FullName) -Relative -ErrorAction 'SilentlyContinue'; + if (-not $relativePath) { $relativePath =$item.Name; }; + if ($relativePath.StartsWith(".\") -or $relativePath.StartsWith("./")) { + $relativePath =$relativePath.Substring(2); + }; - foreach ($item in ($allItems)) {$hash = (Get-FileHash -Path ($item.FullName) -Algorithm ($Algorithm)).Hash.ToLower(); - - $relativePath = Resolve-Path -Path ($item.FullName) -Relative -ErrorAction 'SilentlyContinue'; - if (-not $relativePath) { $relativePath =$item.Name; }; - if ($relativePath.StartsWith(".\")) { - $relativePath =$relativePath.Substring(2); + $outputLine = "${hash}${relativePath}"; + $linesToWrite +=$outputLine; + Write-Output $outputLine; }; - $outputLine = "$hash$relativePath"; + Set-Content -Path ($singleOutFile) -Value$linesToWrite -Encoding utf8; + } else { + foreach ($item in ($allItems)) {$hash = (Get-FileHash -Path ($item.FullName) -Algorithm ($Algorithm)).Hash.ToLower(); + + $relativePath = Resolve-Path -Path ($item.FullName) -Relative -ErrorAction 'SilentlyContinue'; + if (-not $relativePath) { $relativePath =$item.Name; }; + if ($relativePath.StartsWith(".\") -or $relativePath.StartsWith("./")) { + $relativePath =$relativePath.Substring(2); + }; - if ($singleOutFile) { - Add-Content -Path ($singleOutFile) -Value ($outputLine); - } else { + $outputLine = "${hash}${relativePath}"; $currentOutFile = "$($item.FullName).$($Algorithm.ToLower())"; - $null = New-Item -Path ($currentOutFile) -ItemType 'File' -Force; - Add-Content -Path ($currentOutFile) -Value ($outputLine); + Set-Content -Path ($currentOutFile) -Value$outputLine -Encoding utf8; + Write-Output $outputLine; }; - - Write-Output $outputLine; }; }; } @@ -349,11 +383,11 @@ process { $relativePath = Resolve-Path -Path ($item.FullName) -Relative -ErrorAction 'SilentlyContinue'; if (-not $relativePath) { $relativePath =$item.Name; }; - if ($relativePath.StartsWith(".\")) { + if ($relativePath.StartsWith(".\") -or $relativePath.StartsWith("./")) { $relativePath =$relativePath.Substring(2); }; - $outputLine = "$hash$relativePath"; + $outputLine = "${hash}${relativePath}"; Write-Output $outputLine; }; };