Compress-Archive обрабатывает файлы с одинаковыми именами в Powershell - PullRequest
1 голос
/ 07 апреля 2020

Я пишу сценарий архивации, который собирает нужные файлы в массив, а затем добавляет их в архив 1 на 1.

У меня возникла проблема, когда есть DIR1 / file.ext и DIR2 / file .ext, потому что файл DIR2 будет перезаписывать предыдущий.

Как установить уникальное имя файла или как можно решить его на лету, вместо того, чтобы копировать файлы в каталог со структурами, а затем архивировать весь каталог?

Вот мой код:

# GET FILE LIST
$outgoingfiles =  Get-ChildItem -Depth 1 -Filter "*.EXT" | Where-Object { $_.DirectoryName -like "*OUTGOING*" }

# Handle if OUTGOING/archive dir is exists
if(-not (Test-Path "OUTGOING/archive")) {
       New-Item -Path "OUTGOING/archive" -ItemType Directory 
}

# ZIP outgoing files
ForEach ($outgoing in $outgoingfiles) {
    Compress-Archive $outgoing.FullName -Update -DestinationPath $zippath
}

Спасибо!

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Я не думаю, что есть способ указать Compress-Archive переименовывать файлы, когда файл с таким именем уже включен в zip.

Что вы можете сделать, это создать временную папку, скопируйте туда все файлы и при необходимости переименуйте их. Затем создайте zip-файл, используя уникальные файлы в этой папке. Наконец, снова удалите временную папку:

$zippath  = 'D:\Test\OutGoing.zip'  # path and filename for the output zip file
$rootPath = 'D:\Test'               # where the files can be found

# create a temporary folder to uniquely copy the files to
$tempFolder = Join-Path -Path ([System.IO.Path]::GetTempPath()) -ChildPath ([Guid]::NewGuid().Guid)
$null = New-Item -ItemType Directory -Path $tempFolder
# create a hashtable to store the fileHash already copied
$fileHash = @{}

# get the list of files and copy them to a temporary folder
Get-ChildItem -Path $rootPath -Depth 1 -Filter '*.EXT' -File | Where-Object { $_.DirectoryName -like "*OUTGOING*" } | ForEach-Object {
    $count = 1
    $newName = $_.Name
    # test if the file name is already in the hash and if so, append a counter to the basename
    while ($fileHash.ContainsKey($newName)) {
        $newName = "{0}({1}){2}" -f $_.BaseName, $count++, $_.Extension
    }
    # store this file name in the hash and copy the file
    $fileHash[$newName] = $true
    $newFile = Join-Path -Path $tempFolder -ChildPath $newName
    $_ | Copy-Item -Destination $newFile -Force
}

# append '*.*' to the temporary folder name.
$path = Join-Path -Path $tempFolder -ChildPath '*.*'
# next, get the list of files in this temp folder and start archiving
Compress-Archive -Path $path -DestinationPath $zippath -Update

# when done, remove the tempfolder and files
Remove-Item -Path $tempFolder -Force -Recurse

Надеюсь, это поможет

0 голосов
/ 07 апреля 2020

Я бы просто скопировал файлы вместе с их родительскими каталогами в папку назначения, а затем заархивировал их с помощью Compress-Archive. Тогда вам не нужно беспокоиться об уникальности имен файлов.

Демо:

$sourceFolder = "C:\\"
$destinationFolder = "C:\\OUTGOING"

# Create destination folder if it doesn't exist
if (-not(Test-Path -Path $destinationFolder -PathType Container))
{
    New-Item -Path $destinationFolder -ItemType Directory
}

# Get all .exe files one level deep
$files = Get-ChildItem -Path $sourceFolder -Depth 1 -Filter *.ext

foreach ($file in $files)
{
    # Get standalone parent directory e.g. DIR1, DIR2
    $parentFolder = Split-Path -Path (Split-Path -Path $file.FullName) -Leaf

    # Create destination path with this parent directory
    $destination = Join-Path -Path $destinationFolder -ChildPath $parentFolder

    # Create destination parent directory if it doesn't exist
    if (-not(Test-Path -Path $destination -PathType Container))
    {
        New-Item -Path $destination -ItemType Directory
    }

    # Copy file to parent directory in destination
    Copy-Item -Path $file.FullName -Destination $destination
}

# Zip up destination folder
# Make sure to pass -Update for redoing compression
Compress-Archive -Path $destinationFolder -DestinationPath "OUTGOING.zip" -Update -CompressionLevel Optimal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...