Search code examples
powershellzipfile-extension

Compress files with same name in powershell


I have a folder with more than 1000 file extensions.

This is a sample of my files.

  • AFG.cpg
  • AFG.dbf
  • AFG.prj
  • AFG.sbn
  • AFG.sbx
  • AFG. shp
  • AFG.shx
  • AFG.cpg
  • AGO.dbf
  • AGO.prj
  • AGO.sbn
  • AGO.sbx
  • AGO. shp
  • AGO.shx

I want to zip them according to the first 3 letters. For the sample, I am looking to get two zip files, one for AFG.zip, and AGO.zip.

I was able to compress one file using the following, but the resulting folder returns with the directory name "countries" instead of the file name:

$compress = @{
LiteralPath= "C:\Countries"
CompressionLevel = "Fastest"
DestinationPath = "C:\Countries\Draft.Zip"
}
Compress-Archive @compress

I also tried the following to group the files and compress them:

Get-ChildItem C:\Countries | 
    Group-Object -Property { $_.Name.Substring(0, 3) } |
    % { Compress-Archive -Path $_.Group -DestinationPath "$($_.Name).zip" }

But I am getting the following errors:

[ERROR] Compress-Archive : The path 'AFG.cpg' either does not exist or is not a valid file system
path.
[ERROR] At line:3 char:9
+     % { Compress-Archive -Path $_.Group -DestinationPath "$($_.Name). ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (AFG.cpg:String) [Compress-Archive], InvalidO
   perationException
    + FullyQualifiedErrorId : ArchiveCmdletPathNotFound,Compress-Archive

I believe the error has to do with the third line: > { Compress-Archive -Path $.Group -DestinationPath "$($.Name).zip" }, but not sure how to fix it. I also tried some other code to do this, as this is kind of a popular question but they don't seem to work. I just started to use powershell for this, thank you for any help.

I am using powershell x86.


Solution

  • I was able to zip each of my files thanks to @guiwhatsthat comment. This is the fixed code:

    Get-ChildItem C:\Folder | 
        Group-Object -Property { $_.Name.Substring(0, 3) } |
        % { Compress-Archive -Path $_.Group.FullName -DestinationPath "$($_.Name).zip" }