From c1b8ba580b134b29669512c95a2791a8f4e2a213 Mon Sep 17 00:00:00 2001 From: D Jeffrey <44452180+D-Jeffrey@users.noreply.github.com> Date: Sat, 30 Mar 2024 23:13:55 -0600 Subject: [PATCH] V0.6.7 - changed the iteration and tracking of temporary files to speed up the process - support unicode file name by removing Diacritics - Shortcut will now using PWSH if it is present (`-setup` will trigger an upgrade) --- EmbroideryCollection-Cleanup.ps1 | 379 +++++++++++++++------ README.md | 10 +- docs/images/WindowsTerminal_2024-03-29.png | Bin 0 -> 52638 bytes 3 files changed, 279 insertions(+), 110 deletions(-) create mode 100644 docs/images/WindowsTerminal_2024-03-29.png diff --git a/EmbroideryCollection-Cleanup.ps1 b/EmbroideryCollection-Cleanup.ps1 index c2b3613..8780f91 100644 --- a/EmbroideryCollection-Cleanup.ps1 +++ b/EmbroideryCollection-Cleanup.ps1 @@ -1,4 +1,5 @@ -<# +#Requires -Version 5.1 +<# EmbroideryCollection-Cleanup.ps1 GPL-3.0 license @@ -35,7 +36,7 @@ param [Switch]$CloudAPI # use MySewNet cloud API ) -$ECCVERSION = "v0.6.6" +$ECCVERSION = "v0.6.7" # $VerbosePreference = "Continue" # $InformationPreference = "Continue" @@ -99,13 +100,6 @@ $paramswitch =[ordered]@{ write-host " ".padright(15) "Embroidery Collection Cleanup version: $ECCVERSION on PS $($PSVersionTable.PSVersion.major).$($PSVersionTable.PSVersion.minor)".padright(70) -ForegroundColor White -BackgroundColor Blue - -if ($PSVersionTable['PSVersion'].major -lt 3 ) { - write-Error "This will NOT work on your version of Powershell" - write-host $PSVersionTable['PSVersion'].major - $PSVersionTable - return -} $RemovePrefix = ($PSVersionTable.PSVersion.Major -lt 7 ) $filecnt = 0 $script:sizecnt = 0 @@ -121,7 +115,6 @@ $script:CloudStatusGood = $true $shell = New-Object -ComObject 'Shell.Application' $downloaddir = (New-Object -ComObject Shell.Application).NameSpace('shell:Downloads').Self.Path -# $downloaddir = "C:\Users\darre\source\repos\Embroidery-File-Organize" if (!(test-path $downloaddir)) { Write-Error "The Download Directory does not work, please correct the script" return @@ -189,7 +182,163 @@ if (Test-Path -Path $ConfigFile) { $FirstRun = $true } - +class CloudFile { + # Class properties + [string] $Cloudid + [string] $FileName + CloudFile() { $this.Init(@{}) } + # Convenience constructor from hashtable + CloudFile([hashtable]$Properties) { $this.Init($Properties) } + # Common constructor for id and FileName + CloudFile([string]$Cloudid, [string]$FileName) { + $this.Init(@{Cloudid = $Cloudid; File = $FileName }) + } + # Shared initializer method + [void] Init([hashtable]$Properties) { + foreach ($Property in $Properties.Keys) { + $this.$Property = $Properties.$Property + } + } + # Method to return a string representation of the file + [string] ToString() { + return "$($this.CloudId) by $($this.FileName)" + } +} +class SewingFile { + # Class properties + [String] $NameIndexed # could be file or file.txt + [String] $Name # File.txt + [String] $Base # File + [String] $DirectoryName # C:\Dir\ + [String] $Hash # hash value of the file calculated when we need it + [String] $FullName # C:\Dir\File.txt + [System.IO.FileInfo] $FileInfo + [System.DateTime] $LastWriteTime + [int32] $Priority + [String] $RelPath + [String] $CloudRef + [String] $Push + [System.IO.FileInfo] $TmpPath + [System.IO.FileInfo] $KeepPath + + # Default constructor + SewingFile() { $this.Init(@{}) } + # Convenience constructor from hashtable + SewingFile([hashtable]$Properties) { $this.Init($Properties) } + # Common constructor for id and FileName + SewingFile([string]$Cloudid, [string]$FileName) { + $this.Init(@{Cloudid = $Cloudid; File = $FileName }) + } + # Shared initializer method + [void] Init([hashtable]$Properties) { + foreach ($Property in $Properties.Keys) { + $this.$Property = $Properties.$Property + } + } + # Method to return a string representation of the file + [string] ToString() { + return "$($this.relpath + $this.Name)" + } + [string] MoveFile() { + if ($this.TmpPath) { + copy-item -Path $this.TmpPath.FullName -Destination $this.FileInfo.FullName + $this.TmpPath = $null + } elseif ($this.KeepPath) { + copy-item -Path $this.KeepPath.FullName -Destination $this.FileInfo.FullName + $this.KeepPath = $null + } else { + # Nothing to move + return "" + } + return $this.FileInfo.FullName + } +} + +class SewingFileList { + # Static property to hold the list of SewingFiles + static [System.Collections.Generic.List[SewingFile]] $SewingFiles + # Static method to initialize the list of SewingFiles. Called in the other + # static methods to avoid needing to explicit initialize the value. + static [void] Initialize() { [SewingFileList]::Initialize($false) } + static [bool] Initialize([bool]$force) { + if ([SewingFileList]::SewingFiles.Count -gt 0 -and -not $force) { + return $false + } + + [SewingFileList]::SewingFiles = [System.Collections.Generic.List[SewingFile]]::new() + return $true + } + # Ensure a SewingFile is valid for the list. + static [void] Validate([SewingFile]$SewingFile) { + $Prefix = @( + 'SewingFile validation failed: SewingFile must be defined with the NameIndexed,' + 'FullName, and LastWriteTime properties, but' + ) -join ' ' + if ($null -eq $SewingFile) { throw "$Prefix was null" } + if ([string]::IsNullOrEmpty($SewingFile.NameIndexed)) { + throw "$Prefix NameIndexed wasn't defined" + } + if ([string]::IsNullOrEmpty($SewingFile.FullName)) { + throw "$Prefix FullName wasn't defined" + } + if ([datetime]::MinValue -eq $SewingFile.LastWriteTime) { + throw "$Prefix LastWriteTime wasn't defined" + } + } + # Static methods to manage the list of SewingFiles. + # Add a SewingFile if it's not already in the list. + static [void] Add([SewingFile]$SewingFile) { + [SewingFileList]::Initialize() + [SewingFileList]::Validate($SewingFile) + if ([SewingFileList]::SewingFiles.Contains($SewingFile)) { + throw "SewingFile '$SewingFile' already in list" + } + + $FindPredicate = { + param([SewingFile]$s) + + $s.NameIndexed -eq $SewingFile.NameIndexed -and + $s.AutFullNamehor -eq $SewingFile.FullName -and + $s.LastWriteTime -eq $SewingFile.LastWriteTime + }.GetNewClosure() + if ([SewingFileList]::SewingFiles.Find($FindPredicate)) { + throw "SewingFile '$SewingFile' already in list" + } + +[SewingFileList]::SewingFiles.Add($SewingFile) + } + # Clear the list of SewingFiles. + static [void] Clear() { + [SewingFileList]::Initialize() + [SewingFileList]::SewingFiles.Clear() + } + # Find a specific SewingFile using a filtering scriptblock. + static [SewingFile] Find([scriptblock]$Predicate) { + [SewingFileList]::Initialize() + return [SewingFileList]::SewingFiles.Find($Predicate) + } + # Find every SewingFile matching the filtering scriptblock. + static [SewingFile[]] FindAll([scriptblock]$Predicate) { + [SewingFileList]::Initialize() + return [SewingFileList]::SewingFiles.FindAll($Predicate) + } + # Remove a specific SewingFile. + static [void] Remove([SewingFile]$SewingFile) { + [SewingFileList]::Initialize() + [SewingFileList]::SewingFiles.Remove($SewingFile) + } + # Remove a SewingFile by property value. + static [void] RemoveBy([string]$Property, [string]$Value) { + [SewingFileList]::Initialize() + $Index = [SewingFileList]::SewingFiles.FindIndex({ + param($b) + $b.$Property -eq $Value + }.GetNewClosure()) + if ($Index -ge 0) { + [SewingFileList]::SewingFiles.RemoveAt($Index) + } + } +} function SaveAllParams { # Save the state of the variables and settings @@ -386,6 +535,20 @@ function GetKeystroke ($choices) { return $getkey } +function Test-ExistsOnPath { + param ( + [string]$FileName + ) + $found = $false + $env:Path.Split([System.IO.Path]::PathSeparator) | where-object {$_ -ne ""} | ForEach-Object { + $fullPath = Join-Path $_ $FileName + if (Test-Path $fullPath -PathType Leaf) { + $found = $true + } + } + + return $found +} # return the relative path of existing folders and files relative to a root path with the prefix of .\ function RelativeDirectory { @@ -470,7 +633,10 @@ function DuplicateFileNames($Path, $ExtensionsOrder = @()) { $FileList += $File } } + } + $Files | Sort-Object -Property @{Expression = {(&{if ($ExtensionsOrder.IndexOf($_.Extension) -ne -1) { $ExtensionsOrder.IndexOf($_.Extension) } else {100} })}; Descending = $false} | Group-Object -Property BaseName | where-object count -gt 1 | Out-GridView -Title "Additional instances of these files will be removed - first instances is kept additional are removed" + } # Return the list of duplicate named files with different types return $FileList @@ -586,12 +752,23 @@ Function TailRecursion { function ChecktoClearNewFilesDirectory { if ($Script:clearNewFiles) { if ((get-volume -filePath $NewFilesDir).DriveType -eq "Fixed") { - Get-ChildItem -Path $NewFilesDir -Recurse | Remove-Item -Force -Recurse + Get-ChildItem -Path $("\\?\" + $NewFilesDir) -Recurse | Remove-Item -Force -Recurse write-verbose "CLEARED Copy File Space" } $Script:clearNewFiles = $false } } +<# + function to convert characters which are not found in ASCII; such as á, é, í, ó, ú; into something acceptable such as a, e, i, o, u. + #> +function Remove-Diacritics +{ + Param([string]$Text) + $chars = $Text.Normalize([System.Text.NormalizationForm]::FormD).GetEnumerator().Where{ + [System.Char]::GetUnicodeCategory($_) -ne [System.Globalization.UnicodeCategory]::NonSpacingMark + } + (-join $chars).Normalize([System.Text.NormalizationForm]::FormC) +} function FetchImageFile ([string]$source, [string]$destination) { if (-not (Test-Path $source)) { @@ -1112,10 +1289,11 @@ Function CreateCloudFolder($name, $inFolderID) if ($name.substring(0,1) -eq '\') { $name = $name.substring(1) } + $dianame = Remove-Diacritics $name $CheckName = findMetaDirectory -folderid $inFolderID if ($null -ne $CheckName) { if ($CheckName.Folders.name -like $name) { - $fld = $CheckName.Folders | where-object { $_.name -like $name } + $fld = $CheckName.Folders | where-object { $_.name -like $dianame } # write-host "Folder " $fld.Name " ($name) exists as " $fld.id " for in " $fld.parentfolderid " ($inFoldID) " return $fld.id } @@ -1123,7 +1301,7 @@ Function CreateCloudFolder($name, $inFolderID) $authHeader = authHeaderValues $requestUri = 'https://api.mysewnet.com/api/v2/cloud/folders'; $bodyLines = @{ - "folderName" = $name + "folderName" = $dianame "parentFolderId" = $inFolderID } | ConvertTo-Json @@ -1242,9 +1420,10 @@ function PushCloudFileToDirectory($filepath, $folderpath ) Function PushCloudFile($name, $inFolderID, $filepath) { if (test-Path -Path $filepath) { + $diaName = Remove-Diacritics $name $CheckFolder = findMetaDirectory -folderid $inFolderID if ($null -ne $CheckFolder) { - $fld = $CheckFolder.Files | where-object { $_.name -like $name } + $fld = $CheckFolder.Files | where-object { $_.name -like $dianame } if ($fld) { Write-Verbose "File $($fld.Name) ($name) exists as $($fld.id) in $($fld.parentfolderid) ($inFoldID) " return $fld.id @@ -1265,7 +1444,7 @@ Function PushCloudFile($name, $inFolderID, $filepath) $fileEnc, "--$boundary", "Content-Disposition: form-data; name=`"FileName`"$LF", - $name, + $dianame, "--$boundary", "Content-Disposition: form-data; name=`"FolderId`"$LF", $inFolderID, @@ -1532,11 +1711,12 @@ Function LoadSewfiles { [PSCustomObject]@{ # C:\Dir\File.txt NameIndexed = $n N = $_.Name # File.txt - Ext = $_.Extension # txt + # Ext = $_.Extension # txt Base = $_.BaseName # File DirectoryName = $_.DirectoryName # C:\Dir\ Hash = [string]$null # hash value of the file calculated when we need it FullName = $_.FullName # C:\Dir\File.txt + FileInfo = $_ LastWriteTime = $_.LastWriteTime Priority = $preferredSewType.Indexof($_.Extension.substring(1,$_.Extension.Length-1).tolower()) RelPath = $_.DirectoryName.Substring($EmbroidDir.Length) @@ -1546,21 +1726,22 @@ Function LoadSewfiles { } } if ($null -eq $thelist) { - $datenow = get-date + $FileInfo = New-Object System.IO.FileInfo("C:\placeholder.directoryname\zzzmysewingfiles.placeholder") $thelist = [PSCustomObject]@{ - NameIndexed ="zzzmysewingfiles.placeholder" - N = "zzzmysewingfiles.placeholder" - Ext = "placeholder" - Base = "zzzmysewingfiles" - DirectoryName = "zzzDirectoryName" - Hash = "A100000A" - FullName = "FullName" - LastWriteTime = $datenow + NameIndexed = $fileInfo.Name + N = $fileInfo.Name # File.txt + # Ext = $fileInfo.Extension # txt + Base = $fileInfo.BaseName # File + DirectoryName = $fileInfo.DirectoryName # C:\Dir\ + Hash = "A100000A" # hash value of the file calculated when we need it + FullName = $fileInfo.FullName # C:\Dir\File.txt + FileInfo = $fileInfo + LastWriteTime = $fileInfo.LastWriteTime Priority = 100 RelPath = '?????' CloudRef = $null - Push = $null + Push = "" TmpPath = $null } @@ -1695,22 +1876,6 @@ function AddToSewList { write-Error "** BLANK NAME - '$NameIndex', '$Name', '$directory', '$lastWriteTime' " start-sleep -Milliseconds 100 } - if ($PSVersionTable.PSVersion.Major -ge 6) { - $Extension = split-path $Name -Extension - } Else { - $Extension = (Split-Path -Path $Name -Leaf) -replace '\\.[^.]*$' - } - $Directory = FoldupDirPath -directoryPath $Directory - $fullName = join-path -Path $Directory -ChildPath $Name - if (!($RelativePath)) { - $RelativePath = (Split-path -Path $fullName -parent) - if ($EmbroidDir.Length -lt $RelativePath.Length) { - $RelativePath = $RelativePath.substring($EmbroidDir.Length+1) - } else { - $RelativePath = "" - } - - } $isnewfile = $true if ($quickmysewfiles[$NameIndex]) { # BUG duplicate filename but different checksum??? @@ -1727,10 +1892,12 @@ function AddToSewList { } $hash = $null - if ($KeepAllTypes) { - $tmpfilepath = join-path -Path $tmpdir -ChildPath $RelativePath | join-path -ChildPath $Name - if (test-path $tmpfilepath) { - $hash = (get-filehash -Algorithm md5 $tmpfilepath).Hash + + + if ($KeepAllTypes) { + # $tmpfilepath = join-path -Path $tmpdir -ChildPath $RelativePath | join-path -ChildPath $Name + if ($TmpPath.Exists) { + $hash = (get-filehash -Algorithm md5 $TmpPath).Hash # TODO need to retest the file compare beyond name and date to Hash if (!($isnewfile)) { $isnewfile = $true @@ -1750,28 +1917,38 @@ function AddToSewList { if (!$isnewfile) { return "" } - if ($PSVersionTable.PSVersion.Major -ge 6) { - $Base = split-path -path $name -LeafBase - } else { - $Base = (Split-Path -Path $name -Leaf) -replace '\.[^.]*$' - } + $Directory = FoldupDirPath -directoryPath $Directory + $fullName = join-path -Path $Directory -ChildPath $Name + $fileinfo = New-Object System.IO.FileInfo($fullname) + <# if (!($RelativePath)) { + + $RelativePath = (Split-path -Path $fullName -parent) + if ($EmbroidDir.Length -lt $RelativePath.Length) { + $RelativePath = $RelativePath.substring($EmbroidDir.Length+1) + } else { + $RelativePath = "" + } + + } + #> $script:mysewingfiles += - [PSCustomObject]@{ - NameIndexed = $NameIndex - N = $Name - Ext = "." + $Extension - Base = $Base - DirectoryName = $Directory - Hash = $hash - FullName = $fullName - LastWriteTime = $LastWriteTime - Priority = $preferredSewType.Indexof($Extension.tolower()) - RelPath = $relativepath - CloudRef = $null - Push = '\'+ $RelativePath - TmpPath = $TmpPath - KeepPath = $keepPath - } + [PSCustomObject]@{ + NameIndexed = $NameIndex + N = $Name + # Ext = $fileinfo.Extension + Base = $fileinfo.BaseName + DirectoryName = $Directory + Hash = $hash + FullName = $fullName + FileInfo = $FileInfo + LastWriteTime = $LastWriteTime + Priority = $preferredSewType.Indexof($fileinfo.Extension.tolower()) + RelPath = $relativepath + CloudRef = $null + Push = '\'+ $RelativePath + TmpPath = $TmpPath + KeepPath = $keepPath + } $currentSewingFile = $mysewingfiles.count if ($script:quickmysewfiles[$NameIndex.tolower()]) { $script:quickmysewfiles[$NameIndex.tolower()] += $currentSewingFile @@ -1844,7 +2021,8 @@ function ProcessZipContents { $ts = "*."+ $thistype if ($zipfilelist.Entries.Name -ilike $ts) { $isnew = $false - $SpecificExtensionFiles = $zipfilelist.Entries | where-object {$_.Name -like $ts} + # like our extension, but does not start with . + $SpecificExtensionFiles = $zipfilelist.Entries | where-object {$_.Name -like $ts -AND $_.Name.substring(0,1) -ne "."} ShowProgress "Checking Zips - Looking at $($_.Name) - looking at '$($ts.substring(2).ToUpper())' type" -stat "Added $Script:savecnt files" foreach ($fileInZip in $SpecificExtensionFiles) { $isnewfile = "" @@ -1913,22 +2091,7 @@ function ProcessZipContents { # we found a new file in the Zip. If we have not expanded this Zip, then do it now if ($isnew) { - - $numnew += $(MoveFromDir -fromPath $tmpdir -isEmbrodery $true -files $filesInThisList -whichfiles $ts) - # Fix look for missing files - <# - for ($index = 0; $index -lt $MySewingfiles.count; $index++) { - if ($MySewingfiles[$index].Hash -eq "") { - if (test-path $MySewingfiles[$index].FullName) { -# $MySewingfiles[$index].Hash = $(get-filehash -Algorithm md5 -path $MySewingfiles[$index].FullName).Hash - } Else { - $script:lostfiles += $MySewingfiles[$index].FullName - } - - } - } - #> } } } @@ -2040,14 +2203,27 @@ if ($null -eq $LastCheckedGithub -or (${get-date} -gt $(get-date $LastCheckedGit if ($setup) { write-host " ".padright(70) -BackgroundColor Yellow -ForegroundColor Black $Desktop = [Environment]::GetFolderPath("Desktop") - if (!(test-path ($Desktop + "\Embroidery Organizer.lnk"))) { + $DesktopLink = $Desktop + "\Embroidery Organizer.lnk" + $WshShell = New-Object -comObject WScript.Shell + $Shortcut = $WshShell.CreateShortcut($DesktopLink) + if (test-path ($Desktop + "\Embroidery Organizer.lnk")) { + if ($Shortcut.TargetPath.contains("powershell.exe")) { + if (Test-ExistsOnPath "pwsh.exe") { + Write-Host " Upgraded to using PWSH" -BackgroundColor Yellow -ForegroundColor Black + $Shortcut.TargetPath = "pwsh.exe" + $Shortcut.Save() + LogAction -File $Desktop -Action "Updated-Desktop-Shortcut PWSH" + } + } + } + else { write-host " Creating shortcut on the Desktop".padright(70) -BackgroundColor Yellow -ForegroundColor Black - $WshShell = New-Object -comObject WScript.Shell - $Desktop = $Desktop + "\Embroidery Organizer.lnk" - write-Debug "Link: $Desktop" - $Shortcut = $WshShell.CreateShortcut($Desktop) - - $Shortcut.TargetPath = "$pshome\Powershell.exe" + + if (Test-ExistsOnPath "pwsh.exe") { + $Shortcut.TargetPath = "pwsh.exe" + } else { + $Shortcut.TargetPath = "$pshome\Powershell.exe" + } $icon = join-path -Path $PSScriptRoot -childpath "embroiderymanager.ico" if (!(test-path -path $icon )) { try { @@ -2302,9 +2478,7 @@ Get-ChildItem -Path ($EmbroidDir) -Recurse -file | ForEach-Object { write-host "Starting with All files: $(niceSize $librarySizeBefore) - Embroidery files: $(niceSize $libraryEmbSizeBefore)" ShowProgress "Loading file list" -$mysewingfiles = $null # Get a list of all the existing files in mySewnet - $mysewingfiles = LoadSewfiles $quickmysewfiles = BuildHashofMySewingFiles @@ -2320,20 +2494,9 @@ Get-ChildItem -Path $downloaddir -file -filter "*.zip" | Where-Object { (($_.Cr ForEach-Object { ShowProgress "Checking Zips - Looking at $($_.Name)" -stat "Added $Script:savecnt files" - - Write-Verbose "Checking ZIP '$($_.FullName)'" - ProcessZipContents -zips $_.FullName -Base $_.BaseName - - - - - - } - - # Look for Files which are not part of a ZIP file, just the selected file types that we are looking for that is in the download directory $DownloadDaysOld = 365*10 # 10 years of downloads (when you download files, it keeps the old data) @@ -2383,7 +2546,7 @@ foreach ($thistype in $preferredSewType) { $l = (split-path -Path $fullname -Parent).Substring($downloaddir.Length).trim('\') } $d = (join-path -path $EmbroidDir -childpath $l).Trim('\') - AddToSewList -NameIndex $findfile -Name $f -Directory $d -LastWriteTime $thisfile.LastWriteTime -keepPath $thisfile + AddToSewList -NameIndex $findfile -Name $f -Directory $d -LastWriteTime $thisfile.LastWriteTime -keepPath $thisfile -RelativePath $l } } @@ -2485,8 +2648,6 @@ if (-not $KeepEmptyDirectory) { $script:lostfiles | Out-GridView -Title "Lost Files" if ($CloudAPI -and $CloudAuthAvailable) { - # Re-read the Sewing files - ##### $mysewingfiles = LoadSewfiles $webcollection = ReadCloudMeta if ($null -eq $webcollection) { write-host "Cloud is not working *** STOPPING (Try logging onto MySewnet before retrying)" -ForegroundColor Red @@ -2678,8 +2839,8 @@ if ($CloudAPI -and $CloudAuthAvailable) { write-Host "Cloud unavailable or errored during processing - try again" } } -# $mysewingfiles | out-GridView -# $byExt | Out-GridView + # $mysewingfiles | out-GridView + # $byExt | Out-GridView # Capture the end time $endTimer = Get-Date diff --git a/README.md b/README.md index 0ee38d6..813c2d3 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ A PowerShell script to deal with the many different types of embroidery files, p Once it is set up with a shortcut you can simply download your patterns from online stores and then double-click the shortcut to copy the **right patterns** into your collection location and leave the instructions on your computer for reference later. - +![Img](docs/images/WindowsTerminal_2024-03-29.png) ## Getting started This is a self-contained single PowerShell script (See note below). It can be run by right clicking after downloading and select Run with PowerShell. Windows may prompt if you want to allow PowerShell to run. You may also have to `unblock` the downloaded file (`Right-click` properties of the file and at the bottom check the `unblock`. Once you have copy the script into a location (suggested `c:\ProgramData\EmbroideryOrganize`) (and unblocked), then you can run the script with -setup @@ -117,6 +117,10 @@ This are the directories (plus the if the directory name equals the format type) - **[How to install](docs/How-to-Install.md)** - **[Other docs](docs/)** +#### Seperating the files +When it is comparing patterns it uses the file name to determine if they are the same name. It is case-sensitive and the files must be created on the same day. +`CleanCollection` will clean up files regardless of filename case if you run it, (it will prompt before deleting them) + ### Updated to remove Cloud Sync functionality The myCloud interface is painful to use, as it has bugs such as sorting directories, and only allows you to upload or delete 5 folders/files at a time. Crazy. And now they are pushing customers to use the Vault function instead of the myCloud. Vault will only accept pattern files that it understands, so you cannot keep the instructions with the patterns. I suspect it is in response to the possible misuse of the cloud space they have created. @@ -138,6 +142,10 @@ It appears that v1.5 is the current version (as of Mar 2024): https://www.mysewn - Need to work on Duplicate files of the same name by different file types # Releases +### 0.6.7 +- changed the iteration and tracking of temporary files to speed up the process +- support unicode file name by removing Diacritics +- Shortcut will now using PWSH if it is present (`-setup` will trigger an upgrade) ### 0.6.6 - fixed issues with starting with no files - working on performance diff --git a/docs/images/WindowsTerminal_2024-03-29.png b/docs/images/WindowsTerminal_2024-03-29.png new file mode 100644 index 0000000000000000000000000000000000000000..a91727f35ddccb30240bb2344a999c62761936d5 GIT binary patch literal 52638 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

gUxi_n1Ig)mDq@BGnM%ILYE~vCqX24xH-#4 zw@ZqOcl5%mn9DhjvfEQ%WUt2L%&A6vALO^1{&H6F-M#XEc*+RCRcZTX@<^s2#F4Y* zb({HUSi%Y*L+ze+YLXKpW-$@%%pLZO_iHhDR?qxIh8Ml;BmuWf_;q0`Je_FT>;h1# zM!);^<0b#JOy+4juVEw;QL0_ne7Ai4SrYGYp8Cj76 z&t~9GM~iaT&`;2b-fJ&3mWn+f$CLDH^De*`1S&Y&p??HD7N=;F%_eyG#Av5LeG4mT8W9kb| ztx%@~8y8@CuvO0C_c=BK&3`tJ+NvtwOg?ih)3f^GQ|tXc`m3@!)cIdo`)!^OpQlFh z192Nz9c&Hv?k8ZnEHdZR(&odv>RVLc@&rGdltQU2*7zDR{tR_wfWWPp}!O4cw7~gI0f`zgOWV;|uI$(3VAoB}lH(InA zW3zh${UKM^q@*HRObo2NKs;qxx33Zrn#YrL>A*V4V=q7KccKMaY8y{GD^e(3RwZsS_W-}xlG~(Xq&jC_>03yBx7W! zV+iJu`&s%{!u~>PFpFpME&wKolsF*XnGUEje)9z24y?P7iwn=amnYr z;8?w^fvc~-9>l+w+xS=D z@^Is!<`>6t4qJs^H*GKmG!5a^vtHbWsceb-x2j%Fb14|3s{qa4%S z$+x7Ol9I0qxUT2Ax3|{4t@bIWwk82*tt2}*t`B*yKfe#?xT`Ib!(#yXb6PAQ|1$2u zB~{`+dI&Q)cx-OGL}SQN1NWYl1Wq;qTq(y{$L!N&7G;rKjX5|D{Crghz@bE}u$jnq zsgcAf_HUoUzN#<5TBw0gVg(1uatH$XIp5r4_l%n`Le$!x17+F$$7+5z-_sVGYyke_LjLo61H*Rd33q(5OZUp$sE zHz?v6_OtPK1bt(^#W)xl%ZP81fXnKoZfRyh-g_bs9-%y0Y%a3rvL4` zO#4mC?3A`v$$J9XUD}b(;fif z?nUo#-2&NUt?4gOqT|5Ki$-)GqpVpzK6V2ns~f-4z8fV??m<4$oz?qAnhUb$iznUm zV3R#E2nJ$uH?u*_CBeHWYvwmH(bO)1Mk;JuZwW!{>^?i636)f! zm4dNQ+3m>&zcLQ(6&Ih9&d!k1jljWgJ1t8T97%DT_wK1KHy>cpiGHdjs3U z9McHY6!3b%0Y&UsgBQl$1CT6Vyryvosb(+Z7SFIm#N_sbFweeQC~o@ zZmKswC+KI3waTeHKKyl|#Tp>X8hYx^W+woe-23WD$cxk$_elpuMr7FgvIPpoe`&=J z()Ei|aq;m6pL~*|kdT+lVX*Lj0o!V^ZjMJU-F+!76(Z831<+BmWGAdZ&7a5767`2L z?QXpZ5|=imzl!Gi1lbr78BDQ3-C;VcEkSU+oyNf78k#G0M4JE zez}fj?6!kRj81?!PvNzs!ft!7Y*29A!o|^coXQYD%@o!9F{#caJNWnzxeC!T)cbj# zJ0i|*w9r1;_{F;+2G4tnwci=#`~ zexPL1d-LyXgm|Lm7<_I$7rQ;zK=#eyt=VyMR0lmEK$d0V`Qi|E=M)-5L=?{@0I|Y0 zuQMK{lm1}&6^h$@3phzi=GopRi*bc$D=dG!ZZ35z)}XCEYf0ZO1!_`>7J^p}JOF|V zHKFwEAFW`ST1QGeh9t3EU*9e^@P!ZA^}nd0oEeZTxkXO+wT%c_WKul_f{P0wpQz2X(sP*#^z756=WHY$Ww9hpXzjymAV)-z>gBmS-lt?XQFT4qTYp*igyz- zVd!@_to8o%Jsn;K73W@Z_pWryj0A`yWIt7qj$}%;>tY%7P=9U^!})_majlv<2J+rm zWT|O4R_Uunym^DAw^`l8c*&D#?Q9%JFZC`TPd}4|NTN_PFOsQhsVp}6L8uI{+n@^iD~7drz(JRRUsDpCtyk@`v@G5c2Z z6Jc!;C!u8o)-Z&`AQkxUqz4@+Xiz1x|FkL>D?%}cEwFWaT~$YhLOg7JrQPjiY|*G< zTtT12YrSz6lY>hOIR~ZPPE~vpWh1gZiFQ0A;l7%5+)&UXg+oB|xGEUX)SycB$gb5~ zXcvkgT2ZJT*qCpLg+xGD*WT5xY^}C&k^wP2!nTfHB$-=rIVvzGClW?n5FCup+_ZR} zRoxP2n=`Wpc9Ce`%#o~1X0LV=Z@inT9uut}oKn5&EBud5?SowJt~3AL+%3RZYKo5c z8`I*v(d2TCK>Zu|Hjs%U`oCC6|IKtvxq>}8cz5Qf+D`z$jIZYUkJfi5B6Am;aGThZ zFBtE2MAYKBnH3G1m)kk#KOP?e1V;}h&ZEu=?*rgw_jFOqYdV*l!Rx5)5OiWA3yrqek6 zWno1eL2_jd&gc@7$ItA(;9@T(Q)f>H>E)_}2$at3w#PA?H?%bWcxu?|W762jX~s+M zf9=Cin+as!ZY2ULm9CwKksg<-;{2Wp6*f!x`1B-t82ptOCAWG-@(0z?stKL&9RiS$ z>vTcR+qq&bY9cD&FiP6%#53MVC!!)7q9`>nBd;9nf_HG&u9N#r8dvf%Qu90FN%|`^ z?P1*J7m2(gi|o6hvu}|4kG!y@1lzy)y!fNszte5ainyluZeK@S#B?zd00muQ)8F%T z;QcDK&o0xPDF0zKsj&!u5>1tn==(gp%P{XE8N(9ECC#Z3$QiQFT%wLG@396Q&a>-&|EO*=;V0gwP2T;RM>=4&J7j zTIEvZig;eFYjK%^yDj)QZb{M84Cpr@T~oLTpaPm%jm=zTX3tgByf-Y^_CV1p;t8fA z1kWY{;j`5o5{St&yfCN?O^bRxlvw>zO^R3~oAHYyl=VimQRjxiCOd`X(6Q|(99dp0 zoaj;$y67%IuuOXrXL2`hVF^>wxHta(DO`j2*Kgv~evkvEYqYa6g@Z23Nhd7?MZxfwYu_Pbu-`l!tGWy%MIpnbIC)adQ9pR|21$xOVQ?(Ck`Fi79&a3GNRI@Jm!xk>d;=-tsx5HoWE~U8On#Frr+~Mk_22NZbvN6nD>e=?iJn62_Vy=278S;@H(hQe z_gHF<(NS9cOZCF+3Y%I4@h?O0lV3 zktiP4gQHFG*SQ_R725+a?{U4@p9dTNf89bPh@Vjffs5+9-Dis}&JIZDF`P8U|jh5Z`I*nnM7G!@WEYRw#vH%}w54c+U$R_+- zW43gz-xm+y3X5h=S4t-!)oxp6x6wCV;Mke2;&#|ujyEIst%Zdn2=AWTN&xl2!+A&As`-b|$m*$plxjr1R@X{EJ%Ck9q z@qlFPJ{SKLm79mwXH}KX5;_}TfROsoLtaHVBLgodAS1*5xLP)R3TGrW zdzI*(TD7~m&S=3KnaQ7zTu9ZREpy1NP-mCH{goVN%O64Y|LD zWS4^VZtEEM=NeV2n+RCPFph*z%aa?Skb^rR@iGK@a%ZM~s)G&ATg zVQWzz6itK{`4bmBoRBT=S4q6%Dw~{$@UmxTID;YGU+j}2uDDiRChT=ar*7k`oGMlC zLMcBmr!;V|FE-p?(hy3NXmjq$hp~q3SMn8N7O(z=NwC1Y`)FFcLkj~qY&L)OZ z8UNJ>e9-5Wl2jcN0Q;KO*O@7Mc;BQ5M(px=htBgZFK1>j37dQcgc^LaT?qLw_EOU4 zK&F1-=r$J0rSK!3uP+;#E*7uvB&mnmyDEAdlV@sjU;=C|yfpu0ip5*Db6D%3Q%Mfj zlP}6m{I(z+F1oJvCffr8Nj1J^r5IUk#vih~!!51R;z(X}q1Ni6Oz~OqbE%uL%9;~a z!vLlSIErXWhP))ZL2p9JiIBA4z*-%NaC!v?$y-tEW;Hy8z2XI5d~c}imBG9##&}jB zAF@XB;KT^%-`KOFlKUbT76&^vDq_P$$i=GT)mi}bK3t%lsa2mTB=5qyyGaG8JBdsN3BeZZCPk2X<*s=c4m& zIJ}qF;F0`Uq*}yp-7LqmTUS1JPmX*hoAe6L-#?vu0%$r{niKYp;X8aJU|efRf~VQ$ zVkjX-(Dk#dFoopZ?eWX_d$AC5{9lBR6(Z3lT&_XRpCz)eKSlLyM8cGVaS5f?w8S+v zT5ofTT<21}I8};W2C`nrmyT13K5jh*To@jNvKSpo;roo)fH__5I;{MPl_Aqn>7zy! zo&;T9p@Ap3O)@8@RvSSq6|u{qrXFU$a@;vDQym^9l&schnLh1=i0uQC$S+u=8&61d z-3bdTdz~SRkBoSx8zK{GnAv|>1;%)|j~4!ECV=m5j4SkE48>62I$wa@h{8Nuf^~UQ zniE0iF4DvQEo$ZeE|#=?tlnFz<}8jSGI#Tjxxq#v^VrvjQltXqvL%7_&x7#;=2Uahz{0}71Dh?_Y9@XZKgK4N-uyB zdm^iSwpsPe07QABbkCHuH?Zdf8q-r>McvQm^W?}6{5-j&d-yh@^Rl7grzFPX@TA(N zq)TX3)Bya@AzS(jYs5+@B?kAkaoV_v|FZ_6X(yguBovIXG@^oDh|S05`I# z@Sbtq^YJRT!f%DO*9{vV#oR*rTowf+9V@V6c^Y&c8eEhNz8J^&5B z`^_p>_4}}(Ns>xc>5k8xBEmjuD92T=ViZ4LP`%isl6ts&4K`6UB#}PH_#~5KYZ{2p zqBEPiD{ez_OY1wrSzW`a1OKHcb4_!9@(txkf|H3)+J5qj8Dx?wdW?3E?cn?Ct^^TV z|C8aweu}gzYV>1M0rQZHl?{<1FHK1f5B%N^&_%w%cwO`dn6$Fu8P}H=0yO zm^D~o6Z~0(K%xer|H$=-(`mpe`27l#_xfk2&-Q?#WVFkBMp5+= zDBY_rXLIryCLV!bI|Yonx6eahsyKm`rkzw5%O|B-m{K){1^TihzxJc&ro84F@2~z` zT78F$Qt}i`l%K)pX|vSj-;Kbq;nuwXhuMv6M0!-ZTIrr}GII_rjFHgegJ#B(6%FBB zUaXNWUs?W63NnfAU&?0ZWGbUx;c_W0KHV|oF}95*e3jfGnc^resxbxeV9RTE~dVIkp zN4&P$@8sJ=z!SZnsmqy6wR|H>)Eavsk5>ATHkXk)E39}iksuI4>l}n;0<6D=at-kr zg2H57-{(W0akHCE-six+`rvC~;taLD0=SvGeS+7-t6%NDxc9OXKl;zgYmV8}gD^fy z44uFoUv9srMZo|%G01T~0z70{%6;{lndd80ngflyoO)$(YIa>&fuit}&_#-Ag;nDBA$tM@{&lf>6Z^;m$Nx7YUU*qy4h}ltakE{OZ*=oU7sQl;qA1C;lT*U2i zBo7$?ct7z&;;+uvWxzuZaB%)#Z>c_yQDbscqR?C~6N)Os8g zq7(0SzvLSEbyn6W@O-tF3b#HoGP zS@___#J<7NyF|#**y%vZz3mg86ZEMvtEip>;~}nSAT);lhaoH1gV57`gF|nF(XG*# z;^gycTS-!5Y%6}hC!;W=38@qEV+B=4Owv{c(PW+KowlCNObsU(syqUpD4(`^mwD7U z2_ydf#KAdpD-_qd?7_s*@eQsuLc)AU4*j`fN2ft5#9xg2-jR#zlO@-?wKe$_7 z>Ppc?hXNtALbrOXdMptd_%8?@hzSiouVUA59Sag+3p`L?<~Ch#tt!H?4}K`*XBXJ{ zJ{U8*l}tCo_E_{@dw~2JPP@ZIltXjrJfsyT*szARk21Tmy)L%-8T?o$$zL>t1sTi| z9%ONq7s!C>DL{c=I!+a03Py@{*o52CYHsNf*poMN-Jgga`aIV&KP>K6SkWjDL#E|= z%h8!$pC}81WP#VZfa;b|MW$AM;}h5^Z|cxVO5{SqW4)-XtOvW#6APlP%ug&uIJ;wv zGmkjqwL>U%Q|oSp0p$*Ect(z=yxO6|GSy$<^p;#3w0q^Lkm->P3&jCRhAhKgxkajo z??9+J-{jO~4SYwvCXf}T!0YqlE)T&(27d6SE#c^GcBB;fQrVogT_ePD1lNImG@`7E zAhns!wbuSl%ufV5r|=szu<&)7V4bfqh)M1e_XBH6h1A2oPjiTu8EV0frYjv*fr37h zcC%U2c?YFS%q@5z(@51qP1q8h6~DnP@d@e&M?$d8#)UaOFJ!HU)R6f)W#EdPK|B_S zX@?)H00j;Q*i@y_LkZ{Mfo75SL(;-7Hiuc1amRP!&3|L}`;P7~c(0wP)&UtQk~@9I zK?9sZ<5OCJ8mF4o*JC{8(u4$TE-I{uTfu)MWw`SYJ~C2?#zURv85I_HlL^{*K@Spj zo3+c9iJ#-|K;0}7bI?m&Q?3)561{(xFfl~{W#VML_-(5>z?Q4dE=ZOpO(};;nFIx? zMRK_GFAPpafL{tmB_;<`IRgoX*nnAHp2#rD_X8(`Ol@;6K^B2~W9^r-ywNb3L%H;B zmIw*Th@GoL>}%82fG((NGdEpA65rBi9~NK9=#_x*PfloxH!>ODP zz&bcSS_#{G5svF-{g(-yz%SC{o;e z=>Fquw{DRNIo{x@rUykBoUXKeHT#cAZl(wb!2b#)3P+q*%orCLPCjHhuoDHW^OG)s zH@yXLb*p_l9)9O}Z|hDi0747);zr###r>y3HjCUsCw&t~u#kz=#yfc;hEHrq!lh=H z|MN^uM{oRXFWE@ZHGmvo$g)xNV7VH#u!@g*5%f<9x4nyFm9to6iVI6@$?Q{`+ z(qW)){mAf6#Gg)N%csE5P(1lZcc0PmH>dq?}S4t6$H zDoqoI)3qDhohOSERO z26)ym2k4qlua%yk*H03b`a6g0kkiWAqvbX152b$(4xtX;94ZFsrSI||bUGCoOmuc1 zc&|rIJnQ5RH#zS5GbWyjg-~u(ewM!YIbM&GvT>txFJ|}XD_Ry}FunSf>JCjp3f)#r z1iP=j+dXIU=3jPxWp_n;%UXWSHWAilPJq7Z%INlXCqjdXQwJYq51g$6q4FCSFWvtw=0}R< z6*jE%ks}+pZ2ptP&zEEMx2oAC@6WBx94Ma=uYt0nJ-d$z z_$9XwjFnT9sEH!$6tvPm0=dK}OaVqU;J)I0TEEIk&POFJ^0a&Mul$6gIIfY#`6X4I zADG@Ik;zw;rV^vic~mUa=mns=x9Ci!$wRoSx5R_#Q3{#y8mubCzgZ4^ z@ZgHj7tN}&Dr~OJ@$=jRL|3$T*1vlyc&=;ei=g30;j(TLSBl`)oz-mYLchPKOOq2Dj58Y?uQYtW+;38Yq`~mYwHat&N>DzZ`WJ2u^2g) zNeFh@iC7Ztj&Zel+h_Wg;sc+|M@3TP(p0!=9<8i8_uu1td@r!dfCjZZf2-kP=Yraz ztk}O_B=8lG0m@zP_sVj*4e4hS5yrY_U>QGud9((dP{452KIqTa^BSX8-||Z zwdMh>9V!1rG^SQ>9Om(H{9{G9X5PH_;6Cs0)q1`aY@ITXk$PQ&ziTgRl71hTTeGvD z2i}U$GwV3R@=wYRt_IjC)B-9IR%GRR`47(E(ZJ}R>z53PCjkcx7LT-T^i(hYYcJUa zSdb)M52B&(;NDVhRy*mze-@Te4r&Z}{>Z1)$~~{_lUrSUgI^)%^9Z0b{`WcHlwQtj WJm@}-dyNG6d-g=>ao$5izyAaK_-Zx) literal 0 HcmV?d00001