From 520473ddc1848512721703d27692c2beafa97bde Mon Sep 17 00:00:00 2001 From: D Jeffrey <44452180+D-Jeffrey@users.noreply.github.com> Date: Tue, 31 Dec 2024 22:38:02 -0700 Subject: [PATCH] Major release with new GUI Added --- .gitignore | 9 + EmbroideryCollection-Cleanup.ps1 | 1163 ++++++++---------- README.md | 39 +- docs/How-to-Install.md | 47 - docs/images/WindowsTerminal_2024-03-29.png | Bin 52638 -> 0 bytes docs/images/WindowsTerminal_2024-12-31-C.png | Bin 0 -> 53968 bytes docs/images/WindowsTerminal_2024-12-31.png | Bin 0 -> 44050 bytes docs/images/em_2024-12-26.png | Bin 0 -> 24678 bytes docs/images/pwsh_0.8.1_gui.png | Bin 0 -> 26018 bytes help.md | 51 +- tips.md | 20 +- 11 files changed, 574 insertions(+), 755 deletions(-) delete mode 100644 docs/How-to-Install.md delete mode 100644 docs/images/WindowsTerminal_2024-03-29.png create mode 100644 docs/images/WindowsTerminal_2024-12-31-C.png create mode 100644 docs/images/WindowsTerminal_2024-12-31.png create mode 100644 docs/images/em_2024-12-26.png create mode 100644 docs/images/pwsh_0.8.1_gui.png diff --git a/.gitignore b/.gitignore index cc902ca..ca52740 100644 --- a/.gitignore +++ b/.gitignore @@ -223,3 +223,12 @@ MigrationBackup/ .history/ /EmbroideryCollection.cfg /.vscode +/.vs +/docs/images/old +/gui +/i +*.cmd +*.xaml +*.txt +findduplicate.ps1 +*.zip diff --git a/EmbroideryCollection-Cleanup.ps1 b/EmbroideryCollection-Cleanup.ps1 index 48676f0..41b84ae 100644 --- a/EmbroideryCollection-Cleanup.ps1 +++ b/EmbroideryCollection-Cleanup.ps1 @@ -37,10 +37,9 @@ param [Switch]$CloudAPI # use MySewNet cloud API ) -$ECCVERSION = "v0.8.0" +$ECCVERSION = "v0.8.1" $GitOwner = "D-Jeffrey" $GitName = "Embroidery-File-Organize" -$useold = $false # $VerbosePreference = "Continue" # $InformationPreference = "Continue" @@ -191,317 +190,11 @@ if (Test-Path -Path $ConfigFile) { } -<# -# Example usage -$sewFilesList = [SewFilesList]::new() - -$sewFile1 = [SewFiles]::new("file1.txt", "file1.txt", "file1", "C:\Dir\", "hash1", "C:\Dir\file1.txt", $null, [System.DateTime]::Now, 1, "relPath1", "cloudRef1", "push1", $null, $null) -$sewFile2 = [SewFiles]::new("file2.txt", "file2.txt", "file2", "C:\Dir\", "hash2", "C:\Dir\file2.txt", $null, [System.DateTime]::Now, 2, "relPath2", "cloudRef2", "push2", $null, $null) - -$sewFilesList.AddFile($sewFile1) -$sewFilesList.AddFile($sewFile2) - -$sewFilesList.ListFiles() - -$sewFilesList.RemoveFile("file1.txt") - -$sewFilesList.ListFiles() -#> - -class SewingFile { - # Class properties - [String] $Name - [String] $Base - [String] $DirectoryName - [String] $Hash - [String] $FullName - [System.IO.FileInfo] $FileInfo - [System.DateTime] $LastTime - [int32] $Priority - [String] $RelPath - [String] $CloudRef - [String] $Push - [System.IO.FileInfo] $TmpPath - [System.IO.FileInfo] $KeepPath - [String] $Extension - [String] $NameIndexed - [String] $TypeIndexed - - # Constructor with parameters - SewingFile([String] $fullName, [System.IO.FileInfo] $fileInfo, [System.DateTime] $lastWriteTime, [int32] $priority, [String] $hash = "", [String] $relPath, [String] $cloudRef, [String] $push, [System.IO.FileInfo] $tmpPath, [System.IO.FileInfo] $keepPath) { - $this.Init() - $this.DirectoryName = split-path -path $fullName -Parent - $this.Name = split-path -path $fullName -Leaf - $this.Base = split-path -path $fullName -LeafBase - $this.Extension = split-path -path $fullName -Extension - $this.FullName = $fullName - $this.Hash = $hash - $this.FileInfo = $fileInfo - $this.LastTime = $lastWriteTime - $this.Priority = $priority - $this.RelPath = $relPath - $this.CloudRef = $cloudRef - $this.Push = $push - $this.TmpPath = $tmpPath - $this.KeepPath = $keepPath - $this.SetIndex() - } - - # Constructor with no parameters - SewingFile() { - $this.Init() - $this.SetIndex() - } - SewingFile([String]$Path) { - $this.Init() - $this.FileInfo = get-item -path $Path - [void]$this.GetFileItem() - $this.SetIndex() - - } - SewingFile([System.IO.FileInfo]$fileInfo) { - $this.Init() - $this.FileInfo = $fileInfo - [void]$this.GetFileItem() - $this.SetIndex() - - } - [void]Init() { - $this.Name = "" - $this.Base = "" - $this.DirectoryName = "" - $this.Hash = "" - $this.FullName = "" - $this.Extension = "" - $this.FileInfo = $null - $this.LastTime = [System.DateTime]::Now - $this.Priority = 0 - $this.CloudRef = "" - $this.Push = "" - $this.TmpPath = $null - $this.KeepPath = $null - $this.Extension = "" - - - } - [string]GetName() { - [void]$this.GetFileItem() - return $this.Name - - } - [System.IO.FileInfo]GetFileItem() { - if ($null -eq $this.FileInfo) { - if ("" -ne $this.FullName -and $(Test-Path -Path $this.FullName)) { - $this.FileInfo = get-item($this.FullName) - } - } - if ($null -ne $this.FileInfo) { - $this.Name = $this.FileInfo.Name - $this.Base = $this.FileInfo.BaseName - $this.Extension = $this.FileInfo.Extension - $this.LastTime = $this.FileInfo.LastWriteTime - $this.FullName = $this.FileInfo.FullName - $this.DirectoryName = $this.FileInfo.DirectoryName - - } - return $this.FileInfo - } - [void]SetIndex() { - $this.NameIndexed = $this.Name.toLower() - $this.TypeIndexed = $this.Extension.toLower() - try { - $this.RelPath = $this.DirectoryName.Substring($script:EmbroidDir.Length) - } catch { - $this.RelPath = "" - } - try { - $prior = $script:preferredSewType.Indexof($this.Extension.substring(1,$this.Extension.Length-1).tolower()) - } catch { - $prior = 0 - } - $this.Priority = $prior - - } - # Method to return a string representation of the file - [string] ToString() { - return "$($this.relpath + $this.Name)" - } - [String]GetHash() { - if ($this.Hash -eq "") { - [void]$this.GetFileItem() - if ($this.fileInfo) { - # Expensive operation - Write-debug "Caching Hash of $($this.FullName)" - $this.Hash = $(get-filehash $this.fileInfo.FullName -Algorithm md5).Hash - } - else { - Write-Debug "Error No FileInfo for '$($this.FullName)'" - } - } - return ($this.Hash) - } - [string] MoveFile([string]$DestPath) { - if ($this.TmpPath) { - copy-item -Path $this.TmpPath.FullName -Destination $DestPath - $this.TmpPath = $null - $this.FileInfo = get-item -path $DestPath - [void]$this.GetFileItem() - } elseif ($this.KeepPath) { - copy-item -Path $this.KeepPath.FullName -Destination $DestPath - $this.KeepPath = $null - $this.FileInfo = get-item -path $DestPath - [void]$this.GetFileItem() - } else { - # Nothing to move - return "" - } - - return $this.FullName - } -} - -<# -# Example usage -$sewFilesList = [SewFilesList]::new() - -$sewFile1 = [SewingFile]::new("file1.txt", "hash1", "C:\Dir\file1.txt", $null, [System.DateTime]::Now, 1, "relPath1", "cloudRef1", "push1", $null, $null) -$sewFile2 = [SewingFile]::new("file2.txt", "hash2", "C:\Dir\file2.txt", $null, [System.DateTime]::Now, 2, "relPath2", "cloudRef2", "push2", $null, $null) - -$sewFilesList.AddFile($sewFile1) -$sewFilesList.AddFile($sewFile2) - -$sewFilesList.ListFiles() -#> - -class SewFilesList { - [System.Collections.Generic.List[SewingFile]]$Files - - SewFilesList() { - $this.Files = [System.Collections.Generic.List[SewingFile]]::new() - } - SewFilesList([SewingFile]$aFile) { - $this.Files = [System.Collections.Generic.List[SewingFile]]::new() - Write-Debug "Using New + add" - $this.Files.Add($aFile) - } - - ######## - [void] AddFile([SewingFile] $newFile) { - Write-debug "Before Add $($this.Files.Count)" - if ($this.Files.Count -gt 0) { - - if ($this.Files.NameIndexed -eq $newfile.NameIndexed -and - $($this.Files | Where-Object {$_.NameIndexed -eq $newfile.NameIndexed} | - Where-Object {$_.LastTime.date -le $newfile.LastTime.date.addDays(+1) -and - $_.LastTime.date -ge $newfile.LastTime.date.addDays(-1)}).count -gt 0 ) { - - Write-debug "SewingFile '$($newFile.FullName)' $($newfile.LastTime) already in list" - # throw "SewingFile '$($sfile.FullName)' already in list" - return - } - # TODO Check for Duplicate with same file size - - } - $this.Files.Add([SewingFile]$newFile) - Write-debug "After Add $($this.Files.Count)" - } - ######## - [void] RemoveFile([SewingFile] $FileName) { - $File = this.Find($FileName) - if ($File) { - $this.Files.Remove($File) - } - } - ######## - - [string[]] ListFiles() { - return ($this.Files | ForEach-Object { $_.Name }) - } - [SewingFile] GetFile([string]$Name) { - $NameLower = $Name.toLower() - return $this.Files | Where-Object { - $_.NameIndexed -eq $NameLower -and $_ - } - } - [SewingFile] FindAnyType([string]$BaseName) { - return $this.Files | Where-Object { - $_.Base -ieq $BaseName - } | Select-Object -First 1 - } -} - - -<# Test case -$script:preferredSewType = 'vp4', 'vp3', 'pes', 'pcs','hus','dst' -$script:EmbroidDir = "D:\Users\kjeff\Embroidery" -$DebugPreference = "Continue" -$f = Get-item("D:\Users\kjeff\Embroidery\942.pes") -$sf = [sewingfile]::new($f) -$sfl = [SewFilesList]::new() -$sfl.addFile($sf) -$f = Get-item("D:\Users\kjeff\Embroidery\CC06222-a.pcs") -$sf = [sewingfile]::new($f) -$sfl.addFile($sf) -$sfl.Files.count -$sfl.Files | ft -$sfl.GetFile("942.pes") -# Throw error -$sfl.addFile($sf) -$sfl.ListFiles() -$sfl.GetFile("cc06222-a.PcS") -$sfl.FindAnyType("cc06222-a") -$f = get-item("D:\Users\kjeff\Embroidery\Angels\Angels\ang10a.DST") -$sf = [sewingfile]::new($f) -$sfl.addFile($sf) -$sfl.ListFiles() -$sf = [sewingfile]::new('D:\Users\kjeff\Embroidery\wpooho13a.vp4') -$sfl.addFile($sf) -$sfl.ListFiles() -# Throw error -$sf = [sewingfile]::new('C:\Users\darre\Downloads\wpooho13a.vp4') -$sfl.addFile($sf) -# Throw error -$sfl.addFile([sewingfile]::new('C:\Users\darre\Downloads\wpooho13a.vp4')) -$f = get-item('D:\Users\kjeff\Embroidery\Angels\Angels\Ang10b.pes') -$sf = [sewingfile]::new($f) -$sfl.addFile($sf) -$sfl.ListFiles() - -$x = $($sfl.FindAnyType("942")).GetHash() - -$($sfl.FindAnyType("942")).GetHash() -$($sfl.GetFile("ang10a.dst")).GetHash() -$x -$sfl.ListFiles() -#> - - - -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 ################### +####################### Functions ################### #-#-#-#-#- function SaveAllParams @@ -564,7 +257,6 @@ function Show-Progress { if ($PercentComplete) { $params.PercentComplete = $PercentComplete} if ($Completed) { $params.Completed = $Completed} Write-Progress @params - start-sleep -milliseconds 500 } function Complete-Progress { Show-Progress -Completed $true @@ -575,24 +267,6 @@ if ($missingSewnetAddin) { $DragUpload = $true } - -PrepareCloud - - -$doit = !$Testing - - - -# This is for development testing and debugging - -if ($env:COMPUTERNAME -eq "DESKTOP-R3PSDBU_") { # -and $Testing) { - $docsdir = "d:\Users\kjeff\" - $downloaddir = "d:\Users\kjeff\downloads" - $doit = $true - } - - - #============================================================================================= @@ -668,9 +342,7 @@ function MyPause { if ($psISE -or $useGUI) { Add-Type -AssemblyName System.Windows.Forms $BoxMsg = if ($BoxMsg -eq "" -or $null -eq $BoxMsg) { $Message } else { $BoxMsg } - # if ($YesNoCancel) { - # $x = [System.Windows.Forms.MessageBox]::Show($BoxMsg, 'Embroidery Collection Cleanup', 'YesNoCancel', 'Question') - #} else + if ($Choice) { $x = [System.Windows.Forms.MessageBox]::Show($BoxMsg, 'Embroidery Collection Cleanup', 'YesNo', 'Question') } else { @@ -747,7 +419,7 @@ function GetKeystroke ($choices) { return $getkey } -function DoStart() { +function doWinForm() { Add-Type -AssemblyName System.Windows.Forms $ico = "C:\ProgramData\EmbroideryOrganize\EmbroideryManager.ico" @@ -800,9 +472,9 @@ function DoStart() { Text="Preferred sew file`nsort by preference" } $lbl_otherSewType= New-Object System.Windows.Forms.Label -Property @{ - Location = New-Object System.Drawing.Point(320, 98) + Location = New-Object System.Drawing.Point(260, 98) Size= New-Object System.Drawing.Size(120, 21) - Text="Other sew file" + Text="Other sew file types" } $lbl_location= New-Object System.Windows.Forms.Label -Property @{ Location = New-Object System.Drawing.Point(4, 234) @@ -893,7 +565,7 @@ function DoStart() { $panel.Controls.Add($lbx_preferredSewType) $lbx_otherTypes = New-Object System.Windows.Forms.ListBox -Property @{ - Location = New-Object System.Drawing.Point(320, 120) + Location = New-Object System.Drawing.Point(280, 120) Size = New-Object System.Drawing.Size(68, 108) SelectionMode = [System.Windows.Forms.SelectionMode]::One @@ -907,7 +579,7 @@ function DoStart() { $lbx_otherTypes.Items.AddRange($($alltypes |where-object {$_ -notin $preferredSewType})) # Create the Move Up button $lbbx_moveUpButton = New-Object System.Windows.Forms.Button -Property @{ - Text = "^" + Text = "↑" Location = New-Object System.Drawing.Point(200, 115) Size = New-Object System.Drawing.Size(20, 20) } @@ -922,9 +594,9 @@ function DoStart() { }) $panel.Controls.Add($lbbx_moveUpButton) $lbbx_moveAddButton = New-Object System.Windows.Forms.Button -Property @{ - Text = "<" + Text = "←" Location = New-Object System.Drawing.Point(220, 140) - Size = New-Object System.Drawing.Size(20, 20) + Size = New-Object System.Drawing.Size(30, 20) } $lbbx_moveAddButton.Add_Click({ $selectedIndex = $lbx_otherTypes.SelectedIndex @@ -935,9 +607,9 @@ function DoStart() { }) $panel.Controls.Add($lbbx_moveAddButton) $lbbx_moveRmButton = New-Object System.Windows.Forms.Button -Property @{ - Text = ">" + Text = "→" Location = New-Object System.Drawing.Point(220, 165) - Size = New-Object System.Drawing.Size(20, 20) + Size = New-Object System.Drawing.Size(30, 20) } $lbbx_moveRmButton.Add_Click({ $selectedIndex = $lbx_preferredSewType.SelectedIndex @@ -950,7 +622,7 @@ function DoStart() { # Create the Move Down button $lbbx_moveDnButton = New-Object System.Windows.Forms.Button -Property @{ - Text = "v" + Text = "↓" Location = New-Object System.Drawing.Point(200, 190) Size = New-Object System.Drawing.Size(20, 20) } @@ -1019,6 +691,8 @@ function DoStart() { if ($btn_go) { $btn_go.Enabled = $true $btn_sync.Enabled = $true + $btn_clean.Enabled = $true + $lbl_Info.Text = "" } if ($cbx_usbeject) { $d = $cmb_location.Items[$cmb_location.SelectedIndex] @@ -1036,11 +710,23 @@ function DoStart() { } } else { $lbl_Info.Text = "USB Drive $d is not ready`n" - $btn_go.Enabled = $false - $btn_sync.Enabled = $false + if ($btn_go) { + $btn_go.Enabled = $false + $btn_sync.Enabled = $false + $btn_clean.Enabled = $false + } } } - } + } + if ($cmb_location.SelectedIndex -eq -1 -and $btn_go) { + $btn_go.Enabled = $false + $btn_sync.Enabled = $false + $btn_clean.Enabled = $false + $lbl_Info.Text = "Select an different output (or insert your USB drive and click refresh)`n" + } + if ($btn_sync) { + $btn_sync.Enabled = ($cmb_location.SelectedIndex -ne 0 -and $btn_go.Enabled) + } } $cmb_location.Add_SelectionChangeCommitted( {driveComboChange}) @@ -1049,7 +735,7 @@ function DoStart() { Text = "Refresh" BackColor="LightSkyBlue" UseVisualStyleBackColor=$False - Location = New-Object System.Drawing.Point(290, 234) + Location = New-Object System.Drawing.Point(260, 234) Size = New-Object System.Drawing.Size(99, 23) } $btn_refreshDir.Add_Click({ @@ -1059,6 +745,7 @@ function DoStart() { $script:USBDrive = $cmb_location.Items[$cmb_location.SelectedIndex] } updateDriveList + driveComboChange if (-1 -eq $cmb_location.SelectedIndex) { $cmb_location.SelectedIndex =$sav } @@ -1068,7 +755,7 @@ function DoStart() { $panel.Controls.Add($cmb_location) $btn_open2 = New-Object System.Windows.Forms.Button -Property @{ Text = "Open" - Location = New-Object System.Drawing.Point(399,234) + Location = New-Object System.Drawing.Point(369,234) Size= New-Object System.Drawing.Size(43, 23) BackColor="LightSkyBlue" Enabled = $false @@ -1094,8 +781,6 @@ function DoStart() { Enabled = $script:USBEject } $panel.Controls.Add($cbx_usbeject) - updateDriveList - driveComboChange # Add the panel to the form @@ -1128,11 +813,12 @@ function DoStart() { # Create the Sync button $btn_sync = New-Object System.Windows.Forms.Button -Property @{ Text = "Sync" - Location = New-Object System.Drawing.Point(4,147) - Size= New-Object System.Drawing.Size(100, 30) + Location = New-Object System.Drawing.Point(4,87) + Size= New-Object System.Drawing.Size(100, 20) ForeColor="White" BackColor="RoyalBlue" UseVisualStyleBackColor="False" + Font="8pt" } $btn_sync.Add_Click({ $script:exitmode = "Sync" @@ -1142,19 +828,67 @@ function DoStart() { $panelB.Controls.Add($btn_sync) $btn_help = New-Object System.Windows.Forms.Button -Property @{ Text = "Help" - Location = New-Object System.Drawing.Point(4,190) + Location = New-Object System.Drawing.Point(4,130) Size= New-Object System.Drawing.Size(100, 30) ForeColor="White" BackColor="RoyalBlue" UseVisualStyleBackColor="False" + } $btn_help.Add_Click({ $script:exitmode = "Help" - Start-Process "https://github.com/D-Jeffrey/Embroidery-File-Organize/help.md" + Start-Process "https://github.com/D-Jeffrey/Embroidery-File-Organize/blob/main/help.md" }) $panelB.Controls.Add($btn_help) - + $btn_clean = New-Object System.Windows.Forms.Button -Property @{ + Text = "Clean up" + Location = New-Object System.Drawing.Point(4,268) + Size= New-Object System.Drawing.Size(100, 20) + ForeColor="White" + BackColor="Darkred" + UseVisualStyleBackColor="False" + Font="8pt" + + } + $btn_clean.Add_Click({ + $script:exitmode = "Clean" + $script:CleanCollection = $true + $script:Sync = $true + $form.Close() + + }) + $panelB.Controls.Add($btn_clean) + + $btn_cfg = New-Object System.Windows.Forms.Button -Property @{ + Text = "Config" + Location = New-Object System.Drawing.Point(4,310) + Size= New-Object System.Drawing.Size(48, 20) + ForeColor="White" + BackColor="Darkred" + UseVisualStyleBackColor="False" + Font="8pt" + } + $btn_cfg.Add_Click({ + $script:exitmode = "Config" + Start-Process "notepad" -ArgumentList $ConfigFile + }) + $panelB.Controls.Add($btn_cfg) + $btn_log = New-Object System.Windows.Forms.Button -Property @{ + Text = "Log" + Location = New-Object System.Drawing.Point(56,310) + Size= New-Object System.Drawing.Size(48, 20) + ForeColor="White" + BackColor="RoyalBlue" + UseVisualStyleBackColor="False" + Font="8pt" + } + $btn_log.Add_Click({ + $script:exitmode = "Config" + Start-Process "notepad" -ArgumentList $LogFile + }) + $panelB.Controls.Add($btn_log) + # Create the Exit button $btn_exit = New-Object System.Windows.Forms.Button -Property @{ Text = "Exit" @@ -1170,17 +904,21 @@ function DoStart() { }) $panelB.Controls.Add($btn_exit) $form.Controls.Add($panelB) - # Hide Console Window -# Check if the type already exists -if (-not ([System.Management.Automation.PSTypeName]'Console.Window').Type) { - Add-Type -Name Window -Namespace Console -MemberDefinition @' - [DllImport("Kernel32.dll")] - public static extern IntPtr GetConsoleWindow(); - - [DllImport("user32.dll")] - public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow); + updateDriveList + driveComboChange + + + # Hide Console Window + # Check if the type already exists + if (-not ([System.Management.Automation.PSTypeName]'Console.Window').Type) { + Add-Type -Name Window -Namespace Console -MemberDefinition @' + [DllImport("Kernel32.dll")] + public static extern IntPtr GetConsoleWindow(); + + [DllImport("user32.dll")] + public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow); '@ -} + } # Now you can use the added type without errors $winstate = [Console.Window]::ShowWindow([Console.Window]::GetConsoleWindow(), 0) @@ -1189,6 +927,7 @@ if (-not ([System.Management.Automation.PSTypeName]'Console.Window').Type) { $form.ShowDialog() [Console.Window]::ShowWindow([Console.Window]::GetConsoleWindow(), $winstate) $script:EmbroidDir = $tbx_EmbrodRootDirtop.Text + # $script:USBDrive if ($cmb_location.SelectedIndex -ge 0) { $script:USBDrive = $cmb_location.Items[$cmb_location.SelectedIndex] @@ -1202,14 +941,16 @@ if (-not ([System.Management.Automation.PSTypeName]'Console.Window').Type) { if ($USBDrive -eq "None") { $script:USBDrive = "" } $script:UsingUSBDrive = ($USBDrive -ne "") } - SetNewFilesDir + $script:SetExiting = ("Exit" -eq $script:exitmode) + if (-not $script:SetExiting) { + SetNewFilesDir + } $script:DownloadDaysOld = $nud_DownloadDaysOld.Value $script:KeepAllTypes = $cbx_KeepAllTypes.Checked $script:preferredSewType = $lbx_preferredSewType.Items $script:USBEject = $cbx_usbeject.Checked # $script:exitmode - $script:SetExiting = ("Exit" -eq $script:exitmode) BuildTypeLists return $SetExiting } @@ -1247,7 +988,6 @@ function RelativeDirectory { function DuplicateFiles($Path) { # Initialize an empty list to store the file objects $FileList = @() - $sp = 0 $Excludes = ($allTypesStar + $TandCs ) AdvanceProgress "Get file list for duplicate files in different directories ...." -BigStep # Get all the files in the directory and sub-directories recursively @@ -1263,17 +1003,14 @@ function DuplicateFiles($Path) { $FileGroups.Group | group-object -property Name | Out-GridView -Title "Additional instances of these files will be removed - as the are exact duplicates" # Loop through each group of files foreach ($FileGroup in $FileGroups) { - # If the group has more than one file, it means there are duplicates - # Sort the files by their directory depth, ascending - $SortedFiles = $FileGroup.Group | Sort-Object -Property @{Expression = {$_.FullName.Split('\').Count}} - # Loop through the rest of the files in the group, starting from the second one - foreach ($File in $SortedFiles[1..($SortedFiles.Count - 1)]) { - # Compare the file hashes of the first file and the current file - # Add the current file's System.IO.FileInfo object to the list of duplicates - $FileList += $File - - + # Sort the files by their directory depth, ascending + $SortedFiles = $FileGroup.Group | Sort-Object -Property @{Expression = {$_.FullName.Split('\').Count}} + # Loop through the rest of the files in the group, starting from the second one + foreach ($File in $SortedFiles[1..($SortedFiles.Count - 1)]) { + # Compare the file hashes of the first file and the current file + # Add the current file's System.IO.FileInfo object to the list of duplicates + $FileList += $File } } @@ -1288,17 +1025,23 @@ function DuplicateFileNames($Path, $ExtensionsOrder = @()) { $FileList = @() $sp = 0 # Get all the files in the directory and sub-directories recursively - $Files = Get-ChildItem -Path $Path -Recurse -File + # Filter it down to just the known files types. Then sort by the preferred types + $Files = Get-ChildItem -Path $Path -Recurse -File | + where-object {$_.Extension.replace(".","") -in ($alltypes + $preferredSewType)} + # If the preferred extensions list is not empty, check for duplicate names with different extensions if ($ExtensionsOrder.Count -gt 0) { # Group the files by their base name (without extension) - AdvanceProgress "Sorting for unneeded formats .... Please wait" -BigStep - $NameGroups = $Files | Group-Object -Property BaseName,LastWriteTime.date + AdvanceProgress "Sorting for extra unneeded files (based on your preferred file types).... Please wait" -BigStep + $NameGroups = $Files | Group-Object -Property Directory,BaseName # ,LastWriteTime.date # Loop through each group of files - foreach ($NameGroup in $NameGroups) { + $dupcnt = $($NameGroups | where-object count -gt 1).count + $cntstep = 0 + foreach ($NameGroup in $($NameGroups | where-object count -gt 1)) { + $cntstep++ if (($sp++ % 20) -eq 0) { - AdvanceProgress "Checking for unneeded formats" + Show-Progress -Activity "Checking for unneeded formats" -PercentComplete $($cntstep*100/$dupcnt) -Status "$cntstep of $dupcnt" } # If the group has more than one file, it means there are duplicates @@ -1314,7 +1057,9 @@ function DuplicateFileNames($Path, $ExtensionsOrder = @()) { } } - $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" + Complete-Progress + $FileList | 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 @@ -1365,19 +1110,20 @@ function CheckAndRemove { if ($cont) { if (!$DeleteWithoutRecycle -and $fcr -gt 100) { - $cont = (MyPause 'This is going to take a while as it moves the files to recycle. Would you like to Delete the file without being able to recover them?' $true 'Click Yes to for a quick delete with NO Recyle!') + $cont = (MyPause 'This is going to take a while as it moves the files to recycle. Would you like to DELETE the files without being able to recover them?' $true 'Click Yes to for a quick delete with NO Recyle!') if ($cont) { $DeleteWithoutRecycle = $true - Write-Host "Switching to Fast quick delete without recycle" -ForegroundColor Yellow + Write-Host "Switching to fast delete without recycle" -ForegroundColor Yellow } } - $howDeleted = if ($HardDelete) { 'Deleting ' } else { 'Recycling ' } + $howDeleted = if ($HardDelete -or $DeleteWithoutRecycle) { 'Deleting ' } else { 'Recycling ' } $fcs = 0 + $ttl = $RemoveFiles.count ForEach ($f in $RemoveFiles) { RecycleFile -file $f.FullName -purge $DeleteWithoutRecycle LogAction -File $f.Name -Action "--Remove-file" if ($fcs % 10 -eq 0) { - AdvanceProgress ($howDeleted + "extra files from cache") "$fcs of $fcr - $($f.Name)" + Show-Progress -Activity $($howDeleted + "extra files from cache") -Status "$fcs of $ttl - $($f.Name)" -PercentComplete $($fcs/$ttl) } $fcs++ } @@ -1713,7 +1459,6 @@ Function ReadCloudMeta() } else { # Recurse the structure and add a Path attribute to the collection with the directory names CloudMetaAddPath "" $result - $global:webresultpath = $result } return $result } @@ -1865,7 +1610,7 @@ Function DeleteCloudFolder ($id) $requestUri = 'https://api.mysewnet.com/api/v2/cloud/folders/'+ $id; $webcollection.folderId $pool = $webcollection - # BUGS + # BUGS TODO <# do { $pool | Select-Object -ExpandProperty Folders | Where-Object {$id -in ($_.folder.Id)} | ForEach-Object { @@ -1881,7 +1626,6 @@ Function DeleteCloudFolder ($id) } catch { # Note that value__ is not a typo. LogAction -File "Error Deleting folder id: '$id'" -Action ("StatusDescription:" + $_.Exception.Response.StatusCode.value__ + " "+ $_.Exception.Response.StatusDescription) - # write-warning ("StatusDescription:" + $_.Exception.Response.StatusCode.value__ + " "+ $_.Exception.Response.StatusDescription) $result = "" $myError = $_ } @@ -1908,9 +1652,7 @@ Function DeleteCloudFile ($id) $result = Invoke-RestMethod -Uri $requestUri -Method "DELETE" -Headers $authHeader } catch { # Note that value__ is not a typo. - # write-host "StatusCode:" $_.Exception.Response.StatusCode.value__ LogAction -File "Error Deleting file id: '$id'" -Action ("StatusDescription:" + $_.Exception.Response.StatusCode.value__ + " "+ $_.Exception.Response.StatusDescription) - #write-warning ("StatusDescription:" + $_.Exception.Response.StatusDescription) $result = "" $myError = $_ } @@ -1952,7 +1694,6 @@ Function MoveCloudFile ($fileid, $toFolderid) $result = Invoke-RestMethod -Uri $requestUri -Method "PUT" -Headers $authHeader -ContentType "application/json" -Body $bodyLines } catch { # Note that value__ is not a typo. - # write-warning ("StatusDescription: "+ $_.Exception.Response.StatusCode.value__ + " " + $_.Exception.Response.StatusDescription) LogAction -File "Error Moving file id: '$fileid'" -Action ("StatusDescription: "+ $_.Exception.Response.StatusCode.value__ + " " + $_.Exception.Response.StatusDescription) $result = "" @@ -2000,7 +1741,6 @@ Function CreateCloudFolder($name, $inFolderID) $result = Invoke-RestMethod -Uri $requestUri -Method POST -Headers $authHeader -ContentType "application/json" -Body $bodyLines } catch { # Note that value__ is not a typo. - # write-warning ("StatusDescription: " + $_.Exception.Response.StatusCode.value__ + " " + $_.Exception.Response.StatusDescription) LogAction -File "Error Pushing the folder: '$name'" -Action ("StatusDescription: "+ $_.Exception.Response.StatusCode.value__ + " " + $_.Exception.Response.StatusDescription) $result = "" $myError = $_ @@ -2110,7 +1850,7 @@ function PushCloudFileToDirectory($filepath, $folderpath ) Function PushCloudFile($name, $inFolderID, $filepath) { - if (test-Path -Path $filepath) { + if (test-Path -LiteralPath $filepath) { $diaName = Remove-Diacritics $name $CheckFolder = findMetaDirectory -folderid $inFolderID if ($null -ne $CheckFolder) { @@ -2192,11 +1932,11 @@ function FoldupDirPath { $folding = $false foreach ($r in $foldupDirs) { if ($directoryPathLower.EndsWith("\$r")) { - if ($(Split-Path $directoryPath -IsAbsolute) -and ($directoryPath.Length -lt $EmbroidDir.Length)) { + if ($(Split-Path $directoryPath -IsAbsolute) -and ($directoryPath.Length -lt $script:EmbroidDir.Length)) { # Emergency panic exit - $directoryPath = $EmbroidDir + $directoryPath = $script:EmbroidDir Write-Warning "Folding Directories has a problem, please change the 'foldupDir' List" - break + return $directoryPath } # Strip off the directory name and preserve the case of the directory and files if (($directoryPath.Length - $r.Length - 1) -gt $minimumlen) { @@ -2234,12 +1974,12 @@ function MoveFromDir ( if ($files) { $objs = $objs | Where-Object {$_.Fullname.Substring($sublen) -iin $files -or $_.Fullname.Substring($sublen+1) -iin $files} } - $targetdir = $EmbroidDir + $targetdir = $script:EmbroidDir } else { # Move anything that is not a Embrodery type file (alltypes) $dtype = "Instructions" $Excludes = ($allTypesStar + $TandCs ) - # if it is from a nested zip, then keep the zip because we don't yet expand that TODO + # if it is from a nested zip, then keep the zip because we don't yet expand that if (!($isFromNestedRelative)) { $Excludes += @("*.zip") } @@ -2249,10 +1989,11 @@ function MoveFromDir ( } $targetdir = $InstructDir } - if ($objs.count) { - AdvanceProgress -Area "Copying $dtype" -stat "Added ${Script:savecnt} files" + $oc = $objs.count + if ($oc) { + AdvanceProgress -Area "Copying $dtype" -Stat "Added ${Script:savecnt} files" } - + $protime = get-date $objs | ForEach-Object { # If all files or the name matching a file we should be moving.. # if (($null -eq $files) -or ($_.Name -in $files)) { @@ -2267,20 +2008,20 @@ function MoveFromDir ( $newdir = FoldupDirPath -directoryPath $newdir $newpath = join-path -path $targetdir -childpath $newdir - if (Test-Path -Path $newpath -PathType Leaf) { + if (Test-Path -LiteralPath $newpath -PathType Leaf) { # what do if there is already a file with the same name as the folder? Rename the confliciting folder $parent = Split-Path -Path $newpath -Parent $thisfolder = Split-Path -Path $newpath -Leaf $newpath = join-path -path $parent -childpath $($thisfolder.Replace('.','-')) } - if (!(Test-Path -Path $newpath -PathType Container)) { + if (!(Test-Path -LiteralPath $newpath -PathType Container)) { New-Item -Path $newpath -ItemType Directory | Out-Null } $npath = Join-Path -Path $newpath -ChildPath $newfile - if (test-path $npath) { # See if the file already exists + if (test-path -LiteralPath $npath) { # See if the file already exists - $newHash = get-filehash -Algorithm md5 $_ - $orgHash = get-filehash -Algorithm md5 $npath + $newHash = get-filehash -Algorithm md5 -LiteralPath $_ + $orgHash = get-filehash -Algorithm md5 -LiteralPath $npath if ($orgHash -eq $newHash) { $attrcheck = get-item $_.FullName if ($attrcheck.attributes.hasflag([IO.FileAttributes]'Readonly')) { @@ -2297,11 +2038,11 @@ function MoveFromDir ( } # Test to see if we purged the file ub the previous step, otherwise we will overwrite the file - if (test-path $_) { + if (test-path -LiteralPath $_) { # BUG # this can happen with the same file type is nested within other directories which then get folded to the same directory and are duplicate # We could rename the files, but then the code above need to find and match the same rename pattern - if (test-path $npath) { + if (test-path -LiteralPath $npath) { Write-verbose " WARNING File already exists $npath for $($_.FullName) - maybe renaming - overwriting?" } else { @@ -2320,7 +2061,7 @@ function MoveFromDir ( LogAction $newfile -Action "++Added-MoveFrom" # BUG THIS IS THE LINE THAT ERRORS out wiht Directory Not Found $movedirto = split-path -path $npath -parent - if (!(test-path -Path $movedirto -PathType Container)) { + if (!(test-path -LiteralPath $movedirto -PathType Container)) { New-Item -Path $movedirto -ItemType Directory | Out-Null } Move-Item $_ -Destination $npath -force # -ErrorAction SilentlyContinue @@ -2328,9 +2069,10 @@ function MoveFromDir ( Write-Information "+++ Saving ${dtype}:'$_' to ${newdir} & ${newfiledir}" } } - - if ($loopy++ % 20 -eq 0) { - AdvanceProgress -Area "Copying $($_.Name)" -Stat "Added ${Script:savecnt} files" + $loopy++ + if ($((get-date) - $protime).Seconds -gt 1) { + $protime = get-date + Show-Progress -Activity "$loopy - Copying $($_.Name)" -Status "Added ${Script:savecnt} files" -PercentComplete $($loopy*100/$oc) } } return $newFileCount @@ -2387,7 +2129,7 @@ function NiceSize ($size) { #> Function LoadSewfiles { - $thelist = (Get-ChildItem -Path $EmbroidDir -Recurse -file -include $PrefSewTypeStar)| ForEach-Object { + $thelist = (Get-ChildItem -Path $script:EmbroidDir -Recurse -file -include $PrefSewTypeStar)| ForEach-Object { if ($keepAllTypes) { $n = $_.Name} else { @@ -2405,7 +2147,7 @@ Function LoadSewfiles { FileInfo = $_ LastWriteTime = $_.LastWriteTime Priority = $preferredSewType.Indexof($_.Extension.substring(1,$_.Extension.Length-1).tolower()) - RelPath = $_.DirectoryName.Substring($EmbroidDir.Length) + RelPath = $_.DirectoryName.Substring($script:EmbroidDir.Length) CloudRef = $null # Push = $null TmpPath = $null @@ -2563,7 +2305,7 @@ function AddToSewList { write-Error "** BLANK NAME - '$NameIndex', '$Name', '$directory', '$lastWriteTime' " start-sleep -Milliseconds 100 } - $isnewfile = $true + $isFoundnewfile = $true $Directory = FoldupDirPath -directoryPath $Directory if ($quickmysewfiles[$NameIndex]) { # BUG duplicate filename but different checksum??? @@ -2585,28 +2327,21 @@ function AddToSewList { $hash = $null - 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 - foreach ($q in $quickmysewfiles[$NameIndex]) { - if (!($mysewingfiles[$q-1].Hash)) { - $mysewingfiles[$q-1].Hash = (get-filehash -Algorithm md5 $mysewingfiles[$q-1].FullName).Hash - } - if ($mysewingfiles[$q-1].Hash -eq $hash) { - return "" - } + if ($TmpPath.Exists) { + $hash = (get-filehash -Algorithm md5 $TmpPath).Hash + # TODO need to retest the file compare beyond name and date to Hash + foreach ($q in $quickmysewfiles[$NameIndex]) { + if (!($mysewingfiles[$q-1].Hash)) { + $mysewingfiles[$q-1].Hash = (get-filehash -Algorithm md5 $mysewingfiles[$q-1].FullName).Hash + } + if ($mysewingfiles[$q-1].Hash -eq $hash) { + return "" } - } } + } else { + # we need to extract it to compare + return "-" } - - if (!$isnewfile) { - return "" - } $fullName = join-path -Path $Directory -ChildPath $Name $fileinfo = New-Object System.IO.FileInfo($fullname) @@ -2639,9 +2374,8 @@ function AddToSewList { $Script:savecnt = $Script:savecnt + 1 if ($relativepath) { return join-path -Path $relativepath -childpath $Name - } else { - return $Name - } + } + return $Name } @@ -2684,7 +2418,7 @@ function Search-ZipFile { # If the entry is a zip file, extract it to a temporary location and search it recursively $nestedZipPath = [System.IO.Path]::Combine($tempDir, $entry.FullName) $nestedzipParentPath = split-path -path $nestedZipPath -parent - $mynull = [System.IO.Directory]::CreateDirectory( $nestedzipParentPath) + [System.IO.Directory]::CreateDirectory( $nestedzipParentPath) | Out-Null [System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $nestedZipPath) if (test-path -path $nestedZipPath) { @@ -2716,7 +2450,7 @@ function ExpandAZip { $resultTmpDir = (Join-Path $tmpdir -childpath $RelativePath).trim("\") # Check for long path names inside the zip file - write-progress -Activity "Expanding Zip Archive.. Please wait " -Status (split-path -path $zippath -leaf) + Show-progress -Activity "Expanding Zip Archive.. Please wait " -Status (split-path -path $zippath -leaf) $bigzip = (get-item $zippath).Length -gt $use7zipsize if (($bigzip -or $havewarning) -and (Test-Path "C:\Program Files\7-Zip\7z.exe")) { Set-Alias sevenz "C:\Program Files\7-Zip\7z.exe" @@ -2736,6 +2470,28 @@ function ProcessZipContents { $NestedName = "" # Is it a zip in a zip ) + function BuildTmpAPath { + param ( + $NewMadeDir, + $FileFullName + ) + if ($NewMadeDir) { + $buildAPath = join-path -path $tmpdir -ChildPath $NewMadeDir + } else { + $buildAPath = $tmpdir + } + $buildAPath = join-path -path $buildAPath -childpath $FileFullName + if (test-path -LiteralPath $buildAPath) { + $NewtempPath = get-item -LiteralPath $buildAPath + } else { + write-warning "Could not access: $($buildAPath.substring($tmpdir.Length))" + # TODO this should not be counted + $NewtempPath = "NOACCESS" + } + + return $NewtempPath + } + $thisZipBase = $Base -replace ' \(([0-9]+)\)' try { $zipfilelist = [io.compression.zipfile]::OpenRead($zips) @@ -2755,7 +2511,6 @@ function ProcessZipContents { } else { $madeDir = $NestedName } - $resultTmpDir = $null $isZipExtracted = $false $isnew = $false $numnew = 0 @@ -2784,60 +2539,38 @@ function ProcessZipContents { } $relativepath = Split-path -Path $fileInZip.FullName -parent if ($madedir) { - $relativepath = join-path -Path $madeDir -ChildPath $relativepath + $relativepath = join-path -Path $madeDir -ChildPath $relativepath } $dirn = (join-path -Path $EmbroidDir -ChildPath $relativepath).trim('\') if ($isZipExtracted) { - - if ($madedir) { - $buildpath = join-path -path $tmpdir -ChildPath $madeDir - } else { - $buildpath = $tmpdir - } - $buildpath = join-path -path $buildpath -childpath $fileInZip.FullName - if (test-path -Path $buildpath) { - $tempPath = get-item -path $buildpath - } else { - write-warning "Could not access: $($buildpath.substring($tmpdir.Length))" - # TODO this should not be counted - $tempPath = "NOACCESS" - } - + $tempPath = BuildTmpAPath -NewMadeDir $madeDir -FileFullName $fileInZip.FullName } else { $tempPath = $null } # Can not add a file we don't have access too if ("NOACCESS" -eq $tempPath) { - $isnewfile = $false + $isnewfile = "" } else { $isnewfile = AddToSewList -Name $fileInZip.Name -Directory $dirn -NameIndex $n -LastWriteTime $fileInZip.LastWriteTime -RelativePath $relativepath -TmpPath $tempPath } - - if ($isnewfile) { + if ("-" -eq $isnewfile -and -not $isZipExtracted) { + # TODO We should not expand the ZIP, if the file type found is a duplicate of another type... hard to determine + $isZipExtracted = $true + ExpandAZip -zippath $zips -RelativePath $madeDir |out-null + #try again + $tempPath = BuildTmpAPath -NewMadeDir $madeDir -FileFullName $fileInZip.FullName + if ("NOACCESS" -eq $tempPath) { + $isnewfile = "" + } else { + $isnewfile = AddToSewList -Name $fileInZip.Name -Directory $dirn -NameIndex $n -LastWriteTime $fileInZip.LastWriteTime -RelativePath $relativepath -TmpPath $tempPath + } + } + + if ("" -ne $isnewfile) { Write-verbose "New file '${filenameInZip}'" $isnew = $true $filesInThisList += $isnewfile - if (-not $isZipExtracted) { - $isZipExtracted = $true - ExpandAZip -zippath $zips -RelativePath $madeDir |out-null - # Fix up Hash triggered by the first file - foreach ($q in $quickmysewfiles[$n]) { - if (!($mysewingfiles[$q-1].Hash) -and !(test-path -Path $mysewingfiles[$q-1].FullName)) { - $tmpfile = $(join-path -Path $tmpdir -ChildPath $mysewingfiles[$q-1].RelPath | join-path -ChildPath $mysewingfiles[$q-1].N) - if (test-path $tmpfile) { - $Script:mysewingfiles[$q-1].Hash = (get-FileHash -Algorithm md5 -Path $tmpfile).Hash - if ($madedir) { - $buildpath = join-path -path $tmpdir -ChildPath $madeDir - } else { - $buildpath = $tmpdir - } - $tempPath = get-item -path $(join-path -path $buildpath -ChildPath $fileInZip.FullName) - $Script:mysewingfiles[$q-1].TmpPath = $tempPath - } - } - } - } } else { if ($VerbosePreference -eq "Continue") { $fileInstance = $mysewingfiles | where-object {$_.NameIndexed -eq $filenameInZip} @@ -2847,7 +2580,7 @@ function ProcessZipContents { } } - # we found a new file in the Zip. If we have not expanded this Zip, then do it now + # we found a new file in the Zip if ($isnew) { $numnew += $(MoveFromDir -fromPath $tmpdir -isEmbrodery $true -files $filesInThisList -whichfiles $ts) } @@ -2920,53 +2653,8 @@ function BuildTypeLists() { $script:allTypesStar = $alltypes | ForEach-Object {"*.$_"} } -BuildTypeLists -if (-not $doit){ - $PSDefaultParameterValues = @{ - "Copy-Item:WhatIf"=$True - "Move-Item:WhatIf"=$True - "Remove-Item:WhatIf"=$True -} -} - - -if (-not $EmbroidDir.contains("\")) { - $EmbroidDir = join-path -path $docsdir -childpath $EmbroidDir -} -$InstructDir = $EmbroidDir - -# TODO test path for exists - -$LogFile = join-path $PSScriptRoot -childpath "EmbroideryCollection.Log" -if (!(test-path $LogFile)) { - "$PSCommandPath Powershell action log file\n" | Set-Content -Path $LogFile -} - -if ($null -eq $LastCheckedGithub -or ($(get-date) -gt $(get-date $LastCheckedGithub).adddays(7))) { - $latestTag = Get-LatestGitHubTag -RepositoryOwner $GitOwner -RepositoryName $GitName - $script:LastCheckedGithub = get-date -format "g" - if ($latestTag) { - Write-Verbose "Latest tag in D-Jeffrey/Embroidery-File-Organize $latestTag" - if ($latestTag -gt $ECCVERSION) { - Write-host " *** Newer version ($latestTag) of this script is available" -ForegroundColor Green - $upgrademe = MyPause -Message "Do you want to upgrade" -Choice $true -Timeout 300 -ChoiceDefault $false - if ($upgrademe) { - $upgradescript = Join-Path -Path $PSScriptRoot -ChildPath "install.ps1" - if (test-path $upgradescript) { - powershell -ExecutionPolicy bypass -file $upgradescript - return - } else { - Write-Warning "Automatic upgrade script '$upgradescript' can not be found to run, continuing without upgrade" - } - } - } - } - else { - Write-Verbose "Failed to retrieve the latest tag for D-Jeffrey/Embroidery-File-Organize from github." - } - } <# .SYNOPSIS Do the configuration for Setup Processes @@ -3170,42 +2858,19 @@ Function DoSetup() { Return $false } -######################## - -if ($setup) { - if (DoSetup){ - break - } -} - -if ($useold) { - Write-Host " ".padright(5) "Let's begin managing the Embroidery files".padright(80) -ForegroundColor white -BackgroundColor blue -} -if ($FirstRun) { - Write-Host " ".padright(15) $("** Checking ALL Zip files **".padright(70)) -ForegroundColor white -BackgroundColor blue -} - -# Clean out the old tmp working space -write-progress -Activity "Cleaning up temporary work space" -Get-ChildItem -Path ($tmpdir ) -Recurse | Remove-Item -force -Recurse -if (-not (Test-Path -Path $tmpdir )) { New-Item -ItemType Directory -Path ($tmpdir )} -Complete-Progress - -$failed = $false - -# TODO change for USBDrive -# We will put all the new files in here for now - $UsingUSBDrive = $False - function SetNewFilesDir () { if ("" -ne $USBDrive) { - do { $driveletter = CheckUSBDrive $USBDrive $needadrive = "" -eq $driveletter if ($needadrive) { $needadrive = MyPause "USB Drive $usbDrive is not ready, do you want to use your USB Stick (insert it now)" -choice $true + if (-not $needadrive) { + $driveletter = "" + $script:USBDrive = "" + + } } } while ($needadrive) if ("" -ne $driveletter) { @@ -3218,32 +2883,114 @@ function SetNewFilesDir () $Script:UsingUSBDrive = $True } - - - } else { + } + # if USBDrive is not ready or was not selected then use the internal temporary space + if ("" -eq $USBDrive) { $Script:UsingUSBDrive = $false $Script:clearNewFiles = $true $Script:NewFilesDir = ${env:temp} + "\cleansew.new" if (-not (Test-Path -Path $NewFilesDir )) { New-Item -ItemType Directory -Path ($NewFilesDir )} + } +} + +# +############################### MAIN continues ############## +# + +PrepareCloud +$doit = !$Testing + +# This is for development testing and debugging + +if ($env:COMPUTERNAME -eq "DESKTOP-R3PSDBU_") { # -and $Testing) { + $docsdir = "d:\Users\kjeff\" + $downloaddir = "d:\Users\kjeff\downloads" + $doit = $true } + +BuildTypeLists + +if (-not $doit){ + $PSDefaultParameterValues = @{ + "Copy-Item:WhatIf"=$True + "Move-Item:WhatIf"=$True + "Remove-Item:WhatIf"=$True +} } -SetNewFilesDir -$flatdir = -not $noDirectory -if (-not $useold) { - write-progress -Activity "Starting GUI" -Completed +if (-not $EmbroidDir.contains("\")) { + $EmbroidDir = join-path -path $docsdir -childpath $EmbroidDir +} +$InstructDir = $EmbroidDir - $_ = DoStart - if ($script:SetExiting) { - write-host "Stopping" -ForegroundColor green - break +# TODO test path for exists + +$LogFile = join-path $PSScriptRoot -childpath "EmbroideryCollection.Log" +if (!(test-path $LogFile)) { + "$PSCommandPath Powershell action log file\n" | Set-Content -Path $LogFile +} + + +if ($null -eq $LastCheckedGithub -or ($(get-date) -gt $(get-date $LastCheckedGithub).adddays(7))) { + $latestTag = Get-LatestGitHubTag -RepositoryOwner $GitOwner -RepositoryName $GitName + $script:LastCheckedGithub = get-date -format "g" + if ($latestTag) { + Write-Verbose "Latest tag in D-Jeffrey/Embroidery-File-Organize $latestTag" + if ($latestTag -gt $ECCVERSION) { + Write-host " *** Newer version ($latestTag) of this script is available" -ForegroundColor Green + $upgrademe = MyPause -Message "Do you want to upgrade" -Choice $true -Timeout 300 -ChoiceDefault $false + if ($upgrademe) { + $upgradescript = Join-Path -Path $PSScriptRoot -ChildPath "install.ps1" + if (test-path $upgradescript) { + powershell -ExecutionPolicy bypass -file $upgradescript + return + } else { + Write-Warning "Automatic upgrade script '$upgradescript' can not be found to run, continuing without upgrade" + } + } + } + } + else { + Write-Verbose "Failed to retrieve the latest tag for D-Jeffrey/Embroidery-File-Organize from github." + } + } + +######################## + +if ($setup) { + if (DoSetup){ + break } } -ShowPreferences +if ($FirstRun) { + Write-Host " ".padright(15) $("** Checking ALL Zip files **".padright(70)) -ForegroundColor white -BackgroundColor blue +} + +# Clean out the old tmp working space +AdvanceProgress "Cleaning up temporary work space" -BigStep +Get-ChildItem -Path ($tmpdir ) -Recurse | Remove-Item -force -Recurse +if (-not (Test-Path -Path $tmpdir )) { New-Item -ItemType Directory -Path ($tmpdir )} +Complete-Progress + +$failed = $false +# TODO change for USBDrive +# We will put all the new files in here for now + $UsingUSBDrive = $False + +$flatdir = -not $noDirectory + +doWinForm | out-null +Complete-Progress +if ($script:SetExiting) { + write-host "Stopping" -ForegroundColor green + break +} + +ShowPreferences if ($DragUpload) { write-host "Using Web Drag & Drop option" -ForegroundColor Green @@ -3275,7 +3022,7 @@ if (( $EmbroidDir.tolower().contains("\onedrive") )) { Write-Host "The Embroidery files directory '$EmbroidDir' is within OneDrive ---- Warning" -ForegroundColor Yellow } - +$InstructDir = $EmbroidDir if (!( test-path -Path $EmbroidDir -PathType Container)) { Write-Host "Can not find the main directory $EmbroidDir. ---- Stopping" -ForegroundColor Red Write-Host "Usually create '$EmbroidDir' in the with '$docsdir' directory. Create the directory if this is your first time." @@ -3297,39 +3044,34 @@ if ($failed) { break } +if ($sync) { + write-Host " Adding Sync Mode" -ForegroundColor Green +} -if ($useold) { - -$cont = (MyPause 'Press Start to continue, any other key to stop (Auto starting in 10 seconds)' $true 'Click Yes to start' 10 -extraChoice "Setup") -if ('Setup' -eq $cont) { - if (DoSetup){ - break - } - $cont = (MyPause 'Press Start to continue, any other key to stop (Auto starting in 10 seconds)' $true 'Click Yes to start' 10) - } -if (!$cont ) { - Break - } -} - $beginTimer = Get-Date + Add-Type -assembly "system.io.compression.filesystem" Function CalculateSize() { -AdvanceProgress "Calculating size" -BigStep -$script:validsize = $false -$script:librarySizeBefore = 0 -$script:libraryEmbSizeBefore = 0 -Get-ChildItem -Path ($EmbroidDir) -Recurse -file | ForEach-Object { - $script:librarySizeBefore += $_.Length - if ($_.Extension -and $preferredSewType.Contains($_.Extension.Substring(1))) { $script:libraryEmbSizeBefore += $_.Length } + $byExt = @{} + AdvanceProgress "Calculating size" -BigStep + $script:validsize = $false + $eSize = 0 + $EmbSize = 0 + Get-ChildItem -Path $EmbroidDir -Recurse -file | ForEach-Object { + $eSize += $_.Length + $byExt[$_.Extension.replace(".","")] += $_.Length + } + $EmbSize = $(foreach ($_ in $preferredSewType) { if ($_ -in $byExt.Keys) { $byExt[$_]} }) | Measure-Object -Sum | Select-Object -ExpandProperty Sum + + $script:validsize = $true + return ($esize, $EmbSize) } +($librarySizeBefore, $libraryEmbSizeBefore) = CalculateSize +# "Starting with All files: $(niceSize $librarySizeBefore) - Embroidery files: $(niceSize $libraryEmbSizeBefore)" -$script:validsize = $true -return "Starting with All files: $(niceSize $librarySizeBefore) - Embroidery files: $(niceSize $libraryEmbSizeBefore)" -} AdvanceProgress "Loading file list" -BigStep # Get a list of all the existing files in mySewnet $mysewingfiles = LoadSewfiles @@ -3377,7 +3119,7 @@ foreach ($thistype in $preferredSewType) { if ($findfile -in $mysewingfiles.NameIndexed) { Write-verbose "Duplicate file '$($findfile)'" } else { - if (test-path -path $fullname) { + if (test-path -LiteralPath $fullname) { write-Information "checking on $fullname" ChecktoClearNewFilesDirectory $fullname | Copy-Item -Destination $EmbroidDir -ErrorAction SilentlyContinue @@ -3391,7 +3133,7 @@ foreach ($thistype in $preferredSewType) { Write-host $("* New : '$f'").padright(65) " 1 new pattern" -foreground green Write-Information "+++ Copied from Downloads :'$($_.Name)' to $EmbroidDir" $fd = join-Path -Path $d -ChildPath $($fs + "." + $thistype) - if (test-path -path $fd) { + if (test-path -LiteralPath $fd) { Copy-Item -Path $fd -Destination $InstructDir -ErrorAction SilentlyContinue Write-Information "+++ Copied instructions from Downloads :'$($_.Name)' to $InstructDir" LogAction -File $($_.Name) -Action "++Added-from-Download" -isInstrution $true @@ -3422,7 +3164,7 @@ foreach ($thistype in $preferredSewType) { # $mysewingfiles | ft # TODO check for BUGS ?? -CalculateSize + if ($CleanCollection) { write-host "Scanning for files to clean up in cache" @@ -3439,55 +3181,62 @@ if ($CleanCollection) { CheckAndRemove -RemoveFiles $filesToRemove -DeleteWithoutRecycle $HardDelete -why "you have multiple files of different embroidery types" } } - $Movelist = @() - # Look for lone directories - $maxtries = 15 - do { - $foundone = $false - Get-ChildItem -Path $EmbroidDir -Recurse -Directory | Where-Object { $_.GetFiles().count -eq 0 -and $_.GetDirectories().count -eq 1} | ForEach-Object { - # because we moved the directory in a previous iteration, this maybe null - if (test-path -path $_) { - $thisdir = get-item $_ - } else { - $thisdir = $null - } - if ($thisdir -and $thisdir.GetDirectories().count) { - AdvanceProgress -Area $_ -stat "Moving Lone Directories" - $subdir = $thisdir.GetDirectories() - $subitem = get-item -path $subdir - if ($subitem.GetFileSystemInfos().count -eq 0) { - if (-not $KeepEmptyDirectory) { - remove-item $subdir - } + # $proceed = MyPause -Message "Clean up Directory structure. Note this may have side-effects of because the folder structure will be simplified" -Choice $true -ChoiceDefault $false + $proceed = MyPause -Message "Clean up Directory structure. (Remove empty and move lone files up)" -Choice $true -ChoiceDefault $false + if ($proceed) { + $Movelist = @() + # Look for lone directories + $maxtries = 15 + do { + $foundone = $false + Get-ChildItem -Path $EmbroidDir -Recurse -Directory | Where-Object { $_.GetFiles().count -eq 0 -and $_.GetDirectories().count -eq 1} | ForEach-Object { + # because we moved the directory in a previous iteration, this maybe null + if (test-path -LiteralPath $_) { + $thisdir = get-item $_ } else { - $Movelist += [PSCustomObject]@{ - From = $subdir.FullName - To = $thisdir.FullName + $thisdir = $null + } + if ($thisdir -and $thisdir.GetDirectories().count) { + AdvanceProgress -Area $_ -stat "Moving Lone Directories" + $subdir = $thisdir.GetDirectories() + $subitem = get-item -path $subdir + if ($subitem.GetFileSystemInfos().count -eq 0) { + if (-not $KeepEmptyDirectory) { + remove-item $subdir + } + } else { + $Movelist += [PSCustomObject]@{ + From = $subdir.FullName + To = $thisdir.FullName + } + $movefile = get-childitem -path $subdir.FullName -depth 2 -Recurse -Include "*" + if ($movefile.count -gt 1) { + $movefile | move-item -Destination $thisdir.FullName + } + # write-host "move from $subdir to $thisdir" + $foundone = $true } - move-item -Path $($subdir.FullName + "\*") -Destination $thisdir.FullName -force - # write-host "move from $subdir to $thisdir" - $foundone = $true } } - } - # remove the items where we move it From X To Y To Z ... remove 'From X' - $MoveList = $moveList | where-object { $_.From -notin $moveList.To } - #then we need to fix the mysewing files list - $mysewingfiles | Where-Object {$_.DirectoryName -in $MoveList.From } | ForEach-Object { - $MoveTo = $_.DirectoryName - foreach ($MoveLoc in ($MoveList)) { - if ($MoveLoc.From -like $_.DirectoryName) { - $MoveTo = $moveLoc.To - break + # remove the items where we move it From X To Y To Z ... remove 'From X' + $MoveList = $moveList | where-object { $_.From -notin $moveList.To } + #then we need to fix the mysewing files list + $mysewingfiles | Where-Object {$_.DirectoryName -in $MoveList.From } | ForEach-Object { + $MoveTo = $_.DirectoryName + foreach ($MoveLoc in ($MoveList)) { + if ($MoveLoc.From -like $_.DirectoryName) { + $MoveTo = $moveLoc.To + break + } } - } - $_.DirectoryName = $MoveTo - $_.FullName = join-path -path $MoveTo -ChildPath $_.Name - - } #> + $_.DirectoryName = $MoveTo + $_.FullName = join-path -path $MoveTo -ChildPath $_.Name + + } #> - $maxtries-- - } while ($foundone -and $maxtries) + $maxtries-- + } while ($foundone -and $maxtries) + } } @@ -3502,7 +3251,6 @@ if (-not $KeepEmptyDirectory) { } $script:lostfiles | Out-GridView -Title "Lost Files" - if ($CloudAPI -and $CloudAuthAvailable) { $webcollection = ReadCloudMeta if ($null -eq $webcollection) { @@ -3516,13 +3264,14 @@ if ($CloudAPI -and $CloudAuthAvailable) { $cm = 0 $cf = 0 # $tolist = @() - + $protime = get-date $MySewingfiles | ForEach-Object { $thisfile = $_ - $cm = $cm + 1 - if ( $cm % 50 -eq 0) { + $cm++ + if ($((get-date) - $protime).Seconds -gt 1) { + $protime = get-date $n = $($_.FileInfo.Name).PadLeft(22) - write-Progress -Activity "Matching files to Cloud: $n" -PercentComplete ($cm * 100 / $mysewingfiles.count) -Status "$cm of $($mysewingfiles.count)" + Show-Progress -Activity "Matching files to Cloud: $n" -PercentComplete ($cm * 100 / $mysewingfiles.count) -Status "$cm of $($mysewingfiles.count)" } $thisfile.CloudRef = GetFileIDfromCloud $_.N @@ -3530,31 +3279,34 @@ if ($CloudAPI -and $CloudAuthAvailable) { $cf = $cf +1 } } - write-Progress -Activity "Matched files to Cloud " -complete $true + Complete-Progress -Activity "Matched files to Cloud " write-host "Found $cf cloud file which match local cache of $($MySewingfiles.count) files" # $MySewingfiles | Out-GridView -Title "MySewingfiles List" if ($sync) { - write-Host "--- Sync Mode ---" $pool = $webcollection $cloudfileremove = @() do { - $cloudfileremove += $pool | Select-Object -ExpandProperty Folders | select-Object -ExpandProperty Files| Where-Object {$_.Name -notin ($mysewingfiles.N)} - $pool = $pool | Select-Object -ExpandProperty Folders - } while ($pool.files.count + $pool.folders.count -gt 0) - if ($cloudfileremove.count -gt 10) { - write-host "Removing $($cloudfileremove.count) files from Mysewnet Cloud, this is going to take some time... " -ForegroundColor Yellow - } - $i = 0 + $cloudfileremove += $pool | Select-Object -ExpandProperty Folders | select-Object -ExpandProperty Files| Where-Object {$_.Name -notin ($mysewingfiles.N)} + $pool = $pool | Select-Object -ExpandProperty Folders + } while (($pool.files.count + $pool.folders.count) -gt 0) if ($cloudfileremove) { + $i = 0 + $protime = get-date + $fc = $cloudfileremove.count $cloudfileremove | ForEach-Object { - # write-host " --Removing from the cloud" $_.Name - Write-Progress -PercentComplete (($i++)*100/$cloudfileremove.count) "Removing files from cloud :" -Status $_.Name + $i++ + if ($((get-date) - $protime).Seconds -gt 1) { + $protime = get-date + $val =[math]::floor($i*100/$fc) + Show-Progress -PercentComplete $val "Removing files from cloud :" -Status $("$val of $fc " + $_.Name) + } LogAction -File $_.Name -Action "--Deleted-Sync" DeleteCloudFile -id $_.id | Out-Null } + Complete-Progress "Removing files from cloud" } $filestopush = ($mysewingfiles | Where-Object { ($_.Push -and $_.Push.contains('\')) -or ($_.CloudRef -eq $null)}).count @@ -3588,18 +3340,23 @@ if ($CloudAPI -and $CloudAuthAvailable) { if ($script:CloudStatusGood) { write-host "Beginning push to MySewnet: $filestopush files" -ForegroundColor Green $i = 0 + $fc = $MySewingfiles.count + $protime = get-date if ($filestopush -or $sync) { $MySewingfiles | ForEach-Object { $thisfile = $_ + $i++ + $complete = [Math]::floor($i*100/$fc) if ($thisfile.push -and $thisfile.push.contains("\") ) { - $comple = [Math]::Min(100,(($i++)*100/$filestopush)) - Write-Progress -PercentComplete $comple "Pushing files to the Cloud : " -Status $thisfile.N + if ($((get-date) - $protime).Seconds -gt 1) { + $protime = get-date + Show-Progress -PercentComplete $complete "Pushing files to the Cloud : " -Status $thisfile.N + } PushCloudFileToDirectory -filepath ($thisfile.FullName) -folderpath $thisfile.push | Out-Null - LogAction -File ($thisfile.push + "\" + $thisfile.N) -Action "^^Cloud-Added" + LogAction -File ($thisfile.push + $thisfile.N) -Action "^^Cloud-Added" $thisfile.push = "" } if ($sync) { - if ($thisfile.CloudRef) { $samePath = FindCloudidfromPath -foldername $thisfile.RelPath @@ -3613,17 +3370,17 @@ if ($CloudAPI -and $CloudAuthAvailable) { } else { $samePathid = $samePath.id } - - if ($thisfile.CloudRef.FolderId -ne $samePathid -and $isOkToMove) { write-verbose ")) Relocated $($thisfile.N) from $($thisfile.CloudRef.FolderId) to $($samePathid)" MoveCloudFile -fileid $thisfile.CloudRef.Id -toFolderid $samePathid - LogAction -File ($thisfile.RelPath + "\" + $thisfile.N) -Action "^^Cloud-Move" + LogAction -File ($thisfile.RelPath + "\" + $thisfile.N) -Action ">>Cloud-Move" } } else { - $comple = [Math]::Min(100,(($i++)*100/$filestopush)) - Write-Progress -PercentComplete $comple "Syncing files to the Cloud : " -Status $thisfile.N + if ($((get-date) - $protime).Seconds -gt 1) { + $protime = get-date + Show-Progress -PercentComplete $complete "Syncing files to the Cloud : " -Status $thisfile.N + } $spl = $thisfile.DirectoryName.substring($EmbroidDir.Length) PushCloudFileToDirectory -filepath ($thisfile.FullName) -folderpath $spl | Out-null LogAction -File ($spl + "\" + $thisfile.N) -Action "^^Cloud-Added-Sync" @@ -3642,10 +3399,13 @@ elseif ($UsingUSBDrive) { if ($sync) { #TODO this need to include the -not KeepAll Filter $cm = 0 + $protime = get-date $MySewingfiles | ForEach-Object { - if ( $cm++ % 25 -eq 0) { + $cm++ + if ($((get-date) - $protime).Seconds -gt 1) { + $protime = get-date $n = $($_.FileInfo.Name).PadLeft(22) - write-Progress -Activity "Matching files to USB: $n" -PercentComplete ($cm * 100 / $mysewingfiles.count) -Status "$cm of $($mysewingfiles.count)" + Show-Progress -Activity "Matching files to USB: $n" -PercentComplete ($cm * 100 / $mysewingfiles.count) -Status "$cm of $($mysewingfiles.count)" } $usbfile = join-path -path $USBDrive -ChildPath $_.relPath | join-path -ChildPath $_.fileinfo.Name if (test-path ($usbfile)) { @@ -3665,38 +3425,86 @@ elseif ($UsingUSBDrive) { break } $cm = 0 + $protime = get-date $fileToSync = $mysewingfiles | where-object Cloudref -eq $null if ($fileToSync) { $fileToSync | foreach-object { - $n = $($_.FileInfo.Name).PadLeft(25) - write-Progress -Activity "Copying missing files: $n" -PercentComplete ($cm++ * 100 / $fileToSync.count) -Status "$cm of $($fileToSync.count)" + if ($((get-date) - $protime).Seconds -gt 1) { + $n = $($_.FileInfo.Name).PadLeft(25) + $protime = get-date + Show-Progress -Activity "Copying missing files: $n" -PercentComplete ($cm * 100 / $fileToSync.count) -Status "$cm of $($fileToSync.count)" + } $usbfile = New-Object System.IO.FileInfo($(join-path -path $USBDrive -ChildPath $_.relPath | join-path -ChildPath $_.fileinfo.Name)) $usbfile.Directory.Create() copy-item -path $_.fileinfo -Destination $usbfile -Force + $_.CloudRef = $usbfile $Script:addsizecnt += $_.FileInfo.Length + LogAction -File $usbfile.fileinfo.fullName -Action "++Sync-USB" + $cm++ } $script:savecnt = $script:savecnt + $fileToSync.count } + # TODO + + $protime = get-date + $filesToRemoveUSB = get-childitem -path $($USBDrive + "\") -Recurse -File |where-object {$_.Extension.replace(".","") -in ($alltypes)} + $filesToRemoveUSB = $filesToRemoveUSB.FullName | Sort-Object + $removeFiles = @() + $unum = 0 + $usblist = $mysewingfiles.CloudRef | sort-object + if ($usblist) { + foreach ($f in $filesToRemoveUSB) { + if ($f -eq $usblist[$unum]) { + $unum++ + } else { + $removeFiles += $f + while ($f -gt $usblist[$unum]) { + $unum++ + } + } + if ($((get-date) - $protime).Seconds -gt 1) { + $protime = get-date + show-progress -Activity "Checking files to remove" -PercentComplete $($unum*100/$filesToRemoveUSB.count) -status $f + } + } + } + $protime = get-date + $fc = $removeFiles.count + if ($removeFiles) { + $cm= 0 + $removeFiles | foreach-object { + $cm++ + if ($((get-date) - $protime).Seconds -gt 1) { + $protime = get-date + $n = $($_).PadLeft(26) + $n = $n.substring($n.Length-25) + Show-Progress -Activity "Removing extra files: $n" -PercentComplete $($cm * 100 / $fc) -Status "$cm of $fc" + } + + try { + remove-item -path $_ -force -ErrorAction SilentlyContinue | Out-Null + LogAction -File $_ -Action "--Remove-USB" + } catch { + write-output " Problem deleting - $_ -" + } + # $Script:removesizecnt += $_.FileInfo.Length + } } } +} + write-host "Calculating size" -$librarySizeAfter = 0 -$libraryEmbSizeAfter = 0 -$byExt = @{} + + if ($Script:savecnt -gt 0) { if (-not $CloudAPI) { OpenForUpload } - Get-ChildItem -Path ($EmbroidDir ) -Recurse -file | ForEach-Object { - - $librarySizeAfter += $_.Length - $byExt[$_.Extension.replace(".","")] += $_.Length - } - # Calculate the total (sum) of the numbers - $libraryEmbSizeAfter = $(foreach ($_ in $preferredSewType) { if ($_ -in $byExt.Keys) { $byExt[$_]} }) | Measure-Object -Sum | Select-Object -ExpandProperty Sum + ($librarySizeAfter, $libraryEmbSizeAfter) = CalculateSize + } else { if (-not $CloudAPI -and -not $UsingUSBDrive) { if (MyPause "Do you want to open the web page & directory to upload files from last time?" $true) { @@ -3760,3 +3568,4 @@ if ($UsingUSBDrive -and $USBEject) { } Write-Host "End" -ForegroundColor Green MyPause 'Press any key to Close' -Timeout 120 | out-null +# End of script \ No newline at end of file diff --git a/README.md b/README.md index a71d44c..573e191 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ All while keeping the a copy of patterns on your computer for reference along wi ## Make it work Once you have downloaded your embroidery files click on the `icon for EmbroideryCollection-Cleanup` and it will begin the setup process and then look through the download folder and place any downloaded sewing files into the Embroidery folder on your computer. Depending on if you are using a USB to transfer the files or using MySewnet Cloud, the script will look at the recently downloaded files and find the ones that work for your Embroidery machine and put them onto the USB stick or push them up the cloud (without wasting space). And it will separate out the instructions and leave the instructions on your computer with the embroidery files but not duplicate them to the USB or cloud. In the process, it will limit the number of folders in folders, while still bringing some organization to the files. -## How to Install Simple +## How to Install Simple (Automatic) *This working on Windows computers (it would work on a Apple MAC or Linux but have Windows specific extensions, [can a MAC run Powershell](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.4)?)* @@ -42,20 +42,27 @@ If you know a IT security person, have them take a look. Then paste in the two After running the installation, you should have a desktop icon for the script. It will run a setup and ask you how you want to configure it, then it will use the selected folder to keep your 'Embroidery Collection' on your computer are kept and will be organized. By default, the script (and associated files) is installed in `c:\programdata\EmbroideryOrganize\` -![Img](docs/images/WindowsTerminal_2024-03-29.png) +[See Help](help.md) for more instructions on using the program. + +### Control Panel +![Img](docs/images/pwsh_0.8.1_gui.png) +### Output of processing - USB +![Img](docs/images/WindowsTerminal_2024-12-31.png) +### Output of processing - Cloud +![Img](docs/images/WindowsTerminal_2024-12-31-C.png) ## Why? Why would I build a massive, long PowerShell to move a file a few files around? So, this was created to help my wife manage the many embroidery files that she downloads from online stores and move them on to her Pfaff Creative Icon Embroidery machine and I like to optimize and write some code adnd the machine includes the capability to synchronize those files that you download from the cloud my MySewnet. When you buy embroidery files it usually comes with many different types plus the PDF of instructions all as part of a zip file. Now the challenge is that that zip file has a lot of junk in it that you don't need to be sent to MySewnet and it is limited to 100 megabytes unless you want to pay for the subscription service. So unzip the files, find the ones that you really need to keep, separate the instruction files out from the embroidery files, transfer the right ones on to the cloud and therefore the sewing machine, easy peasy. I chose to use PowerShell so that people did not have to deal with downloading Python. It is in one file to minimize complications for downloading and installed it. Simplifying so that people can get up and running is in a minimal number of clicks .. *easy peasy* .. **NOT** so much for me.. *but hopefully for other users*. -That is what this is. Originally, she could only keep about 40 downloads on her 'cloud storage space' on MySewnet. Add to that the bugs in the web interface and limit of uploading 5 files at a time. Compare that to this script which is easy for this script to have over a thousand files in the 100 MB space. (Since most of the space would be for the diagram and instructions, and extra duplicate files of different types.) +That is was where this started. Originally, she could only keep about 40 downloads on her 'cloud storage space' on MySewnet. Add to that the bugs in the web interface and limit of uploading 5 files at a time. Compare that to this script which is easy for this script to have over a thousand files in the 100 MB space. (Since most of the space would be for the diagram and instructions, and extra duplicate files of different types.) A PowerShell script to deal with the many different types of embroidery files, put the right format types in [mySewnet™](https://mysewnet.com/) or onto your USB stick. If you take look at the zip files you purchased full Embroidery patterns, it will come with many different types of files, along with PDF and JPG instructions. That's all well and nice but only give you 100 megabytes to put all your files into, so why would you want to waste it with instructions. This script strips it down to the that are appropriate to sync onto my sewing net and get rid of the spread of the folder structures that comes along with it. It is great that the creator of file images produces so many variations, but you only need one type of make your machine work. 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, along with the right file on your computer for reference later. -## Getting started +## Getting started Manually (if you did not use the Automatic setup above) 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 ``` @@ -67,7 +74,6 @@ This is a self-contained single PowerShell script (See note below). It can be r Once you have run it once, it will create a EmbroideryCollection.CFG file in the same directory as the script, which you can edit to adjust the settings (and/or you can use command line parameters to change the settings). It will also a file `EmbroideryCollection.Log` for any of its actions. - ## Functions Checks the download directory for the Embroidery files types of any age and all the zip files which have been downloaded in *DownloadDaysOld*. Any Embroidery files found are copied in to the Mysewing cloud folder under *EmbrodRootDirtop* directory (set below). Any zip files found are scanned to see if they have Embroidery file types that we are interested in. If they are files which do not yet exist in the mysewingnet cloud, then extract that zip to a temporary location, pull out all the relevant files (formats we want) with the directory hierachy (adjusted). Also pull out any related documentation and put it with pattern files on the computer (not onto the USB or Cloud). @@ -77,21 +83,12 @@ When vendors build zip files and put them in all the different formats, it means ## Requirements -It was designed to work with [mySewnet™ Cloud](https://cloud.mysewnet.com/) which is a type of file share service for sewing machines. It can also be used. The authentication model used for Mysewnet is used as normal, so you will see a login page (if it does not fully load, please login to mysewnet from a reguler web browser page first and then run the script again) +It was orginally designed to work with [mySewnet™ Cloud](https://cloud.mysewnet.com/) which is a type of file share service for sewing machines. It can also be used with USB Drives or Send file to functions. If Mysewnet is used you will see a login page (if it does not fully load, please login to mysewnet from a reguler web browser page first and then run the script again) Depending on the types Embroidery file extensions your machine uses, then you may what to change the sewing file types of for your machine. Order matters, if will find the first one in your list of types and try and keep files of that type over the other types. `$preferredSewType = ('vp3', 'vp4')` -### Nice to know - -If you have `7zip` installed on your computer, (the native version, not MS store version), then it will be used when working with large zip files as it is much faster. -It will create folders when there is a number of files `-SetSize` that are in a given zip file using the name of the zip file. You most likely will want to rename it and give it a new name which reflects the folder. - -Ignore files which are terms and conditions (it does not mean you can ignore the laws, just don't save so many copies of the files. -`$TandCs = @('TERMS-OF-USAGE.*', 'planetappliquetermsandconditions.*')` Edit your config (EmbroideryCollection.cfg) file to adjust these values. -This are the directories (plus the if the directory name equals the format type) -`$foldupDir = @('images','sewing helps','Designs', 'Design Files')` Edit your config file. - **[How to install](docs/How-to-Install.md)** - **[Other docs](docs/)** @@ -101,21 +98,23 @@ When it is comparing patterns it uses the file name to determine if they are the `CleanCollection` will clean up files regardless of filename case if you run it, (it will prompt before deleting them). **Use this option carefully, it is one of the few options that will remove files that it did not nessarily create.** ### Other good to knows -They also make the Explorer Plug-in which appears as a right click in File Explorer. (**Great**, so obviously they have not tried this out in Windows 11, because W11 hides that in the classic functionality.) This is [MySewnet Embroidery Software](https://softwarehelp.mysewnet.com/MSW/140/Configure/#t=Topics%2FUsing_the_Explorer_Plugin.htm) Be aware that if you keep your repository in OneDrive the rendering of the pattern as an Icon does not work as of Apr 2024. It appears that v1.5 is the current version (as of Mar 2024): https://www.mysewnet.com/en-us/embroidery/download-software. +They also make the Explorer Plug-in which appears as a right click in File Explorer. (**Great**, so obviously they have not tried this out in Windows 11, because W11 hides that in the classic functionality.) This is [MySewnet Embroidery Software](https://softwarehelp.mysewnet.com/MSW/140/Configure/#t=Topics%2FUsing_the_Explorer_Plugin.htm) Be aware that if you keep your repository in OneDrive the rendering of the pattern as an Icon does not work as of Apr 2024. It appears that v1.5 is the current version (as of Dec 2024): https://www.mysewnet.com/en-us/embroidery/download-software. Look for the the Download Explorer-Plug-In link. # Issues/Future - If is processed as a group of separate zip files which have the same file in different patterns, it will choose a different preferred type than desired - does not support onedirectory deep switch yet - does not warn if cloud will exceed limits with the latest push -- need more refactoring -- some interactive setup options should have other choices before deciding. -- Cloud push is depend on unique files names. +- needs more refactoring +- Cloud push is dependant on unique files names. MAJOR BUG - Should set the File Explorer Folder View when a new folder is created if the add-in in place to Large or Huge Icon view -- Need to work on Duplicate files of the same name by different file types - refactoring to use class to address some issues above # Releases +### 0.8.1 +- GUI Refinements, USB state detection +- Fixed Clean Collection and Sync +- Add buttons Clean up, Log, Config ### 0.8.0 - GUI Interface - Add space available check to Sync to USB diff --git a/docs/How-to-Install.md b/docs/How-to-Install.md deleted file mode 100644 index 1a1b878..0000000 --- a/docs/How-to-Install.md +++ /dev/null @@ -1,47 +0,0 @@ -# How to Install - -~~If you have MySewnet Cloud~~ - -1. First download the script go to https://github.com/D-Jeffrey/Embroidery-File-Organize/blob/main/EmbroideryCollection-Cleanup.ps1 and click on the Download icon (just below History on the right side of the page). Move to the file `EmbroderyCollection-Cleanup.ps1` it to a a folder like **`Documents\scripts`** -2. Select the file and select the Properties click on `unblock` -3. Put the file in a directory such as - - For the location of the item put in something like `Embroidery Instructions` inside of the folder `Documents` -4. Open a command prompt (Start -> Run -> `CMD`) - cd to the directory of the - - create a short cut to the script with a command such as -``` -Powershell -ex bypass -command ".\EmbroderyCollection-Cleanup.ps1 -setup" -``` - - For the name use something like` Embrodery Extractor` -3. Create a directory in **Documents** call `Embroidery Instructions` -4. If you have a lot of duplicate and extract files in your Mysewnet Cloud folder then create a folder in **Downloads** and move all the files into that folder. - - Don't worry will put all the right files back in there for you - -5. Create a folder in **Documents** call `Embroidery` - - -6. (Optional) Edit the PS1 file and set the types of patterns that work best for you. - `$preferredSewType = ('vp3', 'vp4')` - - See [File Types](File-Types.md) - -You should be ready to go now... run the program by clicking on the shortcut and watch the results.. - -Or run Powershell and at the command prompt using the commandline options such as: -``` -PS> cd C:\Users\darre\Documents\Embroidery -PS> EmbroderyCollection-Cleanup.ps1 -Testing -PS> EmbroderyCollection-Cleanup.ps1 -? -PS> EmbroderyCollection-Cleanup.ps1 -DownloadDaysOld 720 - -``` -7. I also suggest you download and install **[MySewnet Embroidery Software](https://download.mysewnet.com/)** & **[Explorer Plug-in Software](https://download.mysewnet.com/)** from Mysewnet, their thumbnail file preview feature is very well done. -![explorer with preview](images/2022-12-27_10-56-25.gif) - - - - - - - -$ScriptFromGitHub = Invoke-WebRequest https://raw.githubusercontent.com/D-Jeffrey/Embroidery-File-Organize/main/install.ps1 -Invoke-Expression $($ScriptFromGitHub.Content) \ No newline at end of file diff --git a/docs/images/WindowsTerminal_2024-03-29.png b/docs/images/WindowsTerminal_2024-03-29.png deleted file mode 100644 index a91727f35ddccb30240bb2344a999c62761936d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52638 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

gUxi_n1Ig)mDq@BGnM%ILYE~vCqX24xH-#4 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 WJm@}-dyNG6d-g=>ao$5izyAaK_-Zx) diff --git a/docs/images/WindowsTerminal_2024-12-31-C.png b/docs/images/WindowsTerminal_2024-12-31-C.png new file mode 100644 index 0000000000000000000000000000000000000000..89cca6230952eae02d6e82c9006ab34f43a5a26e GIT binary patch literal 53968 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 G$Nvk~0FE30 literal 0 HcmV?d00001 diff --git a/docs/images/WindowsTerminal_2024-12-31.png b/docs/images/WindowsTerminal_2024-12-31.png new file mode 100644 index 0000000000000000000000000000000000000000..1f070fb55e7d21d7c84d832aa69f9a41f3f22b1e GIT binary patch literal 44050 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

WDA8q0(W*=!)s@$^_YoJZL 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 Rpse$!PB_?<|KNA!zX1M-SJ?mn literal 0 HcmV?d00001 diff --git a/docs/images/em_2024-12-26.png b/docs/images/em_2024-12-26.png new file mode 100644 index 0000000000000000000000000000000000000000..4002a6e077d85527d4c78d7701d07a3af244851b GIT binary patch literal 24678 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 z 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 z zz*$G>k@J3T7b-d4wUmLG?oD->K^Wt~k*DXR9F=f8uQv`K?-a$c9G9;ESqLB}>d`uL zGW?C6%Rlb5%vfKSc!na&fBBaLE^ykE( zZ3m654wVTY!X{ug0xnF*rx5#d{#HeevaW!VCiDpUT?Q<%xYhpmS+42e8%zbj=gCh} zrreD;Au#k52`(F4rk-t;chR8|jtSbCa!aN-LQNWu&myreH_bWZ+I-hj^FMlbuE-tU z0iCLHu3Jo(E)lE^lcx2@cjP^>+dg;h>=ZLE!RJ!Y^wkosIBCmEbIQt0tE*10y?d{E zs^1%*Dr$2#S&#tfqotptbe|px5HE>D#C}x&2a0fb;~NGz0Fd1DjmHfra`%_hC5!h% zdq;IiG~9BB;}O73)V2nUgXms{(d>?l;j8z%{FC|$THQA@j->@y2yHD2fVL1`Yat4V zjKTp{0nx~aWfRC8F_cuRBZ@t5bLsYSi@OjVYtzN-BZ{n<*?qJW>Ol;Pf^vy-4$O`@ z=o<`%`wQ(d$LH7)05yvD+yC%+GysAtvN&5I#t`^OygDYd0GxNA09B6n<42yt!C>hB z`n=tL)70{YA?%gL%w1bN1PIOqIxv4YES~u@m&MFYET7By?Q$q}LVa=Cv8e^n>-bkw z4F0&9C;nOg75?A(HC)?+*>t<>(CjNNuOH4U zQ{quxIt1#8Q+}`$B-WPj`{JaIoLk2`_zCo3;DDnB91859{y0bSK#38G3ZWi376DZz zk!GOpp7_u2sw(DT0|Jh9iu=NA<*);_`_dDSZdx1pMow4n*FD|fuF$9+G9 z(;8A&C+pJVRqDt0ZRGXr@q1L5Iwc@X<%r+@w%Ppp88coZAE4x_+UDh7Gh;yVK(8tb zRCH|T9T=d(^xG^<1rtj_7*HO%*;4{D`)hVnzz#U6tc?t;k*fx^?6JEmm*DQM-oNZ>*+Q> zUx+*CDt7PRzqc<17iZ)WFYj4=kM8zZ^RoTFEi&qp|6-Qlx0Ak}EBKjd9;}Vp3d*WE z!F4}`AZw$!Dto~jkeB~&xrJZ~?dYK}F3qXag=gSkVjB$8MEzLZozM-Jdy4M%|C}T8et4e-tSSD8-zBfq%~R($L}OOWLl;0!x6BE(xA)Yt;;@tX~^m9-ObEIzYl6*v9H|yOE3%ui0XxT6x=#WThA96F%KG7#RMU r((DU1j7f@slGUWFtOO6cf^ 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 literal 0 HcmV?d00001 diff --git a/help.md b/help.md index ed6a15b..76bdfd8 100644 --- a/help.md +++ b/help.md @@ -1,14 +1,29 @@ # EmbroideryCollection-Cleanup Help --- +[Read Me Introduction](readme.md) +![img](docs/images/pwsh_0.8.1_gui.png) +`Go` - start the process of checking the download folder and copying files into the Embroidery base directory. +`Sync` - Syncronize the collection of files (on your computer internal drive) in the Embroidary base directory to MySewnet or the USB drive selected. +`Help` - this help page. -## Using MySewnet -If you want to push your files into MySewnet, then you will need one additional module [`PSAutheClient`](https://github.com/alflokken/PSAuthClient) from [`alflokken`](https://github.com/alflokken) +`Clean up` - This is three steps: 1) clean out non-preferred embroidery files and duplicates from the the local cache. 2) look for duplicates regardless of if there they are in different directory structure if they have the same name and are created on the same day. It will show a list and promopt before deleting. The files are deleted to the **recycle bin** so they can be restored. 3) it looks for empty or lone file directories and moves them up. (This is experiemental feature, it has side-effects next time you run, it may re-copy in files) + +`Config` - open the configuration file. If you need to add some additional files type to the 'Other sew files' list, this is a good way to access that list. + +`Log` - open the log of all of the activity. + +`Exit` - Do nothing and close +`Embroidery Base Dir` - This is the folder where the Embroidary Collection is stored on your computer. This should not be a USB drive, but a copy which will be selectively copied to the USB drive. It will include all the instructions files extracted from the downloads along with the embroidery file of your preferred type. Just to be safe, this should be a new directory when you first use the program, so make sure that you are not deleting the orginal Embroidery files. You could make a folder, copy all your embroidery files into that folder manually, and then use the Cleanup button to reorganize them to the nessary files. + +`Download days old` - Determine many days old of zip files to look for when choosing which files to check to see if new embroidary files have appeared in your download folder. The Download folder is usually something like c:\users\username\Downloads. It does not look in subdirectories of that folder or other locations. Normally, you would use 1 for this value, since you will run the program right after downloading your purchases from stores. + +`Keep all types` - It is recommended that you do not have this checked and it will only keep the most preferred embroidery file type. If it is check, it will keep all of the preferred types of pattern files (rather than only the one preferred). See `preferred Sew Type` below. ## Command-line parameters @@ -16,9 +31,9 @@ If you want to push your files into MySewnet, then you will need one additional | ------ | ---|--------------- | | `-Setup` | | Interactive setup of parameters, create the directories required, and create a shortcut on the Desktop Icon linked to this PowerShell script. |`-EmbroidDir` directory|↘ | The local cache of embroidery files and instructions. -|`-CleanCollection` | |This is two steps: 1) clean out non preferred embroidery files and duplicates from the the local cache. 2) look for duplicates regardless of if there they are in different directory structure if they have the same name and are created on the same day. It will show a list and promopt before deleting. The files are deleted to the **recycle bin** so they can be restored. (use `-HardDelete` to delete without recycling) +|`-CleanCollection` |↘ |This is two steps: 1) clean out non preferred embroidery files and duplicates from the the local cache. 2) look for duplicates regardless of if there they are in different directory structure if they have the same name and are created on the same day. It will show a list and promopt before deleting. The files are deleted to the **recycle bin** so they can be restored. (use `-HardDelete` to delete without recycling) |`-DownloadDaysOld` x | ↘ | determine how old of zip files to look for (in days) in this case 7 days -| `-Sync` | | Syncronize the files in the local `EmbroidDir` cache to the USB Stick or Mysewnet Cloud cache (depending on selection above). This will only copy the preferred embroidery types to the cloud. This includes creating folders and removing files if they are removed from the local cache (for the Cloud option). +| `-Sync` |↘ | Syncronize the files in the local `EmbroidDir` cache to the USB Stick or Mysewnet Cloud cache (depending on selection above). This will only copy the preferred embroidery types to the cloud. This includes creating folders and removing files if they are removed from the local cache (for the Cloud option). |`-KeepAllTypes` |↘ ◊ |Toggles the option to Keep all of the preferred types of pattern files (rather than only the top preferred) Keep all types of a file (duplicate name but different extensions), normally this will find your most preferred file type and only keep that one. See `preferredSewType` below. |`-KeepEmptyDirectory` |↘ ◊ |Toggle option to keep/remove extra empty directories from Collection folders' | `-USBDrive` I: |↘ | Copy the new files to a specified USB drive (in the form of I: or H: or E:). To Disable USB use 'OFF' for the drive letter @@ -30,14 +45,20 @@ If you want to push your files into MySewnet, then you will need one additional | `-ConfigFile` |↘ | EmbroideryCollection.cfg` The name of the configuration file which is in the same directory as the script itself. The options selected are saved into the configuration file so the next time the script is run the same settings stay in effect. |`-Testing` | | Run it without it doing actual copying of files or cleaning up. -◊ - Switches which which can be toggled on or off it was previously on -↘ - Depreicated +- ◊ - Switches which which can be toggled on or off it was previously on +- ↘ - Depreicated, use the Control Panel to set the switches instead ### Future - `-OneDirectory` Only put files one folder deep. - `-NoDirectory` Put files the root directory only. +## Using MySewnet +Read about how to use and access [mysewnet cloud](https://www.mysewnet.com/en-us/studio/article/transferring-designs-via-mysewnet-cloud) + +If you want to send your files into MySewnet Cloud, then you will need one additional module [`PSAutheClient`](https://github.com/alflokken/PSAuthClient) from [`alflokken`](https://github.com/alflokken). It will be automatically installed if required. (Maybe slower is in current user mode instead of computer install) + + # Messages - Error or otherwise: - `(Runs better with a new version of Powershell)` If you upgrade to Powershell 7 it will run faster. To do this visit Microsft at https://aka.ms/PSWindows or https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.4#install-powershell-using-winget-recommended @@ -45,11 +66,20 @@ If you upgrade to Powershell 7 it will run faster. To do this visit Microsft at - `WARNING: Could not access: ` When you get this message, it is usually related to long files name. This occur if you are using Powershell 5. To correct this, upgrade to Powershell 7 (see above) -- Error messages when working with Diacritics such as á, é, í, ó, ú : +- Any error messages when working with Diacritics such as á, é, í, ó, ú : I try and fix this character so they will work with the cloud, by it is still a bit buggy. - `The Download Directory does not work, please correct the script` : Some how the default download directory is not set on your computer. This should not happen. Not sure under what conditions you would see this error message, please create an issue on the github and provide the type of operating system you are running on. +- `The Embroidery files directory c:\users\username\onedrive\Embroirdery is within OneDrive ---- Warning` +There is a bug in the preview function for the Explorer Add-in which previews it from properly render preview images when it is used within OneDrive. + +# Clean Up button +Use this function CAREFULLY. It removes files and reorganizes the folders. +The `Clean Up` button does a few steps to clean up your collection (it will confirm each step before taking any action): +- Remove duplicates in the collection. +- If you have `Keep all Variation` off then it will look thru the collection and find 'other' format from your preferred format and remove them. +- If will move the folders around by removing unnessary folders inside of folders. (for example do you need a VIP folder with 1 file in it?) @@ -62,4 +92,9 @@ Some how the default download directory is not set on your computer. This shoul Other free software for Windows Explorer Plug-in from https://freesierrasoftware.com/site/get%20it%20now.htm use the dealer code 7393602 or 1234575 to activate. -PREMIER+™ 2 includes an Explorer add-in https://www.premierplusembroidery.com/en/Downloads/PP-Software-Downloads (This is the same softwware used for Mysewnet) \ No newline at end of file +PREMIER+™ 2 includes an Explorer add-in https://www.premierplusembroidery.com/en/Downloads/PP-Software-Downloads (This is the same softwware used for Mysewnet) + + +[Other Tips](tips.md) +[Files Types](docs/File-Types.md) +[How it works](docs/how-it-works.md) diff --git a/tips.md b/tips.md index bfffef8..d3cfca5 100644 --- a/tips.md +++ b/tips.md @@ -1,8 +1,9 @@ # General Tips ## Pin the Embroidery folder Quick Access +If you are looking for your files on a regular basis, then consider using the PIN to Quick Access function in Windows Explorer. [Pin, remove, and customize in Quick access](https://support.microsoft.com/en-us/windows/pin-remove-and-customize-in-quick-access-7344ff13-bdf4-9f40-7f76-0b1092d2495b) ## Restore build Windows Zip -How to restore the native Zip file integration in Windows. You only have to do this from an elevated (run as administrator) command prompt: +If you have installed a 3rd party bloatwear zip package, know what Windows has a nice native function. To restore the native Zip file integration in Windows, you only have to do this from an elevated (run as administrator) command prompt: Click the `Windows Start` > type 'cmd' and select the "Run as Administrator" option to option the command prompt. Type : ``` @@ -12,6 +13,19 @@ and press Enter. You may have to restart the computer. ## Upgrade your Powershell to Version 7 -This is better with Powershell 7 +The performance is better with Powershell 7 -[Installing Powershell version 7](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows) \ No newline at end of file +[Installing Powershell version 7](https://learn.microsoft.com/en-us/powershell/scripting/install/installing-powershell-on-windows) +--or-- +[https://aka.ms/PSWindows](https://aka.ms/PSWindows) + +### Nice to know + +- If you have `7zip` installed on your computer, (the native version, not MS store version), then it will be used when working with large zip files as it is much faster. + +- It will create folders when there is a number of files `-SetSize` that are in a given zip file using the name of the zip file. You most likely will want to rename it and give it a new name which reflects the folder. + +- Ignore files which are terms and conditions (it does not mean you can ignore the laws, just don't save so many copies of the files. +`$TandCs = @('TERMS-OF-USAGE.*', 'planetappliquetermsandconditions.*')` Edit your config (`EmbroideryCollection.cfg`) file to adjust these values. +This are the directories (plus the if the directory name equals the format type) +`$foldupDir = @('images','sewing helps','Designs', 'Design Files')` Edit your config file.