Как пройтись по определенным именам файлов с помощью команды Compress-Archive в Windows PowerShell? - PullRequest
0 голосов
/ 22 мая 2019

Я не слишком знаком с Windows PowerShell (и вообще с консольными командами Windows), но я хочу написать командный файл, который может создавать отдельные zip-архивы из определенных файлов в папке, а затем удалить все, кроме zip-файлов. , Итак, у меня есть папка "C: \ myfolder \", и некоторые файлы в ней, например: myfile0001.a myfile0001.b myfile0001.c myfile0002.a myfile0002.b myfile0002.c myfile0003.a myfile0003.b myfile0003.c ... и так далее.

Я хочу создать .zip для каждого пакета myfileXXXX.a + myfileXXXX.b + myfileXXXX.c и назвать .zips в качестве имен файлов (например, myfile0001.zip будет содержать myfile0001.a + myfile0001.b + myfile0001 .c).

Я знаю, что могу использовать этот код для создания каждого архива .zip по одному:

powershell -Command "& {Compress-Archive -Path C:\myfolder\myfile0001.*  -CompressionLevel Optimal -DestinationPath C:\myfolder\myfile0001.zip}"

И этот код прекрасно работает для удаления всех архивов, кроме .zip

powershell -Command "& {Remove-Item C:\myfolder\*.* -Exclude *.zip}"

Что я не могу решить, так это создать цикл for, который может перебирать все файлы myfileXXXX. * И создать файл myfileXXXX.zip, используя XXXX в качестве возрастающего значения.

Ответы [ 3 ]

0 голосов
/ 22 мая 2019

В PowerShell вы можете сделать:

Get-ChildItem -Path 'C:\myfolder' -File | Where-Object { $_.BaseName -match 'myfile\d{4}' } | Group-Object BaseName | ForEach-Object {
    $target = Join-Path -Path ($_.Group[0].DirectoryName) -ChildPath ('{0}.zip' -f $_.Group[0].BaseName)
    $_.Group | Compress-Archive -CompressionLevel Optimal -DestinationPath $target
    $_.Group | Remove-Item -Force
}

Запись в виде командной строки становится немного уродливой, но здесь вы идете:

powershell -Command "& {Get-ChildItem -Path 'C:\myfolder' -File | Where-Object { $_.BaseName -match 'myfile\d{4}' } | Group-Object BaseName | ForEach-Object { $target = Join-Path -Path ($_.Group[0].DirectoryName) -ChildPath ('{0}.zip' -f $_.Group[0].BaseName); $_.Group | Compress-Archive -CompressionLevel Optimal -DestinationPath $target; $_.Group | Remove-Item -Force}}"
0 голосов
/ 22 мая 2019

Как это? (Просто используйте powershell) Zip-файлы на основе базового имени. .zip автоматически добавляется к имени файла архива.

powershell "ls | foreach { compress-archive $_ $_.basename -update -verbose }"


VERBOSE: The archive file path 'C:\users\js\foo\file1' supplied to the DestinationPath patameter does not include .zip extension. Hence .zip is
 appended to the supplied DestinationPath path and the archive file would be created at 'C:\users\js\foo\file1.zip'.
VERBOSE: Preparing to compress...
VERBOSE: Performing the operation "Compress-Archive" on target "C:\users\js\foo\file1.1".
VERBOSE: Adding 'C:\users\js\foo\file1.1'.
VERBOSE: The archive file path 'C:\users\js\foo\file1' supplied to the DestinationPath patameter does not include .zip extension. Hence .zip is
 appended to the supplied DestinationPath path and the archive file would be created at 'C:\users\js\foo\file1.zip'.
VERBOSE: Preparing to compress...
VERBOSE: Performing the operation "Compress-Archive" on target "C:\users\js\foo\file1.2".
VERBOSE: Adding 'C:\users\js\foo\file1.2'.
VERBOSE: The archive file path 'C:\users\js\foo\file1' supplied to the DestinationPath patameter does not include .zip extension. Hence .zip is
 appended to the supplied DestinationPath path and the archive file would be created at 'C:\users\js\foo\file1.zip'.
VERBOSE: Preparing to compress...
VERBOSE: Performing the operation "Compress-Archive" on target "C:\users\js\foo\file1.3".
VERBOSE: Adding 'C:\users\js\foo\file1.3'.
0 голосов
/ 22 мая 2019

Я все еще не могу проверить это, так как сейчас я не на хосте с Windows, но что-то вроде этого.Его необходимо сохранить как файл .cmd или .bat:

@echo off
 for %%i in (C:\myfolder\*) do (
    powershell -Command "& {Compress-Archive -Path C:\myfolder\%%~ni.*  -CompressionLevel Optimal -DestinationPath C:\myfolder\%%~ni.zip}"
)
...