Сценарий Powershell дублирует существующие файлы в папке назначения при копировании файлов - PullRequest
0 голосов
/ 20 марта 2019

В моем следующем скрипте Powershell я распаковываю заархивированную папку, перемещая другую папку (из другого пути) в путь к этой разархивированной папке.Наконец, верните обратно разархивированную папку и удалите все временные пути, которые я создал во время этого процесса.Он успешно копирует папку, но, к моему удивлению, существующие файлы внутри разархивированной папки дублируются.

Не могли бы вы мне сказать, что я делаю здесь неправильно?

if(Test-Path $Env:BUILD_SOURCESDIRECTORY/MyProject/WEB/dist)
{
    if(Test-Path $Env:BUILD_ArtifactStagingDirectory\MyProject.API.zip)
    {
        Expand-Archive -Path $Env:BUILD_ARTIFACTSTAGINGDIRECTORY\MyProject.API.zip -DestinationPath $Env:BUILD_SOURCESDIRECTORY\MyProject\API\temp -Force
        Write-Host "MyProject.API.zip folder unzipped successfully!"

        New-Item -ItemType Directory -Force -Path $Env:BUILD_SOURCESDIRECTORY\MyProject\WEB\temp1
        Write-Host "A temporary folder 'temp1' inside Web project sources directory created."

        New-Item -ItemType Directory -Force -Path $Env:BUILD_SOURCESDIRECTORY\MyProject\WEB\temp1\temp2
        Write-Host "A temporary folder 'temp2' inside temp1 created."

        Copy-Item $Env:BUILD_SOURCESDIRECTORY\MyProject\WEB\dist\* -Destination $Env:BUILD_SOURCESDIRECTORY\MyProject\WEB\temp1\temp2 -Recurse
        Write-Host "Web project dist folder content copied to the temp temp2 folder"

        Copy-Item -Path $Env:BUILD_SOURCESDIRECTORY\MyProject\WEB\temp1\* -Destination $(Get-ChildItem -Path $Env:BUILD_SOURCESDIRECTORY\MyProject\API\temp -Directory -Recurse | ? {$_.Basename -eq 'MyDestinationFolder'} | % { $_.FullName}) -Recurse -Force
        Write-Host "temp2 folder and its content copied to the 'MyDestinationFolder' folder of the unzipped folder."

        if(Test-Path $Env:BUILD_SOURCESDIRECTORY\MyProject\WEB\temp1)
        {
            Remove-Item -Recurse -Force $Env:BUILD_SOURCESDIRECTORY\MyProject\WEB\temp1
            Write-Host "Temporary temp1 folder deleted."
        }
        Compress-Archive -Path $Env:BUILD_SOURCESDIRECTORY\MyProject\API\temp\* -Update -DestinationPath $Env:BUILD_ARTIFACTSTAGINGDIRECTORY\MyProject.API.zip
        Write-Host "Unzipped folder is zipped back."

        Remove-Item -Recurse -Force $Env:BUILD_SOURCESDIRECTORY\MyProject\API\temp
        Write-Host "Temporary unzipped folder deleted."
    }
}

Ответы [ 3 ]

0 голосов
/ 21 марта 2019

Так что вам не нужно распаковывать MyProject.API.zip, затем добавлять файлы в него, а затем перепаковывать его, чтобы вставить в него файлы ... Вы можете добавить «свободные» файлы в существующий файл .zipв нынешнем виде.

Вот как я это проверил: ( вы должны быть в состоянии выполнить эти шаги, чтобы добиться того, чего вы пытаетесь достичь, я использовал эти шаги, так как им легче следовать):

  • Создан каталог и файл на C:\testing\toAdd\FileToAdd.txt (это имитирует файлы, которые я хочу внедрить)
  • Создал каталог и Zip-файл на C:\testing\zip\Zip.zip (это имитирует, где мой файл .zip живет)
  • В файле Zip.zip есть 2 файла:
    1. New Text Document 1.txt
  • New Text Document 2.txt

Все, что мне нужно было сделать, это запустить следующую команду, чтобы "ввести" FileToAdd.txt в Zip.zip:

Compress-Archive -Path C:\testing\toAdd\* -DestinationPath C:\testing\zip\Zip.zip -Update

Снимки экрана ниже:


Файл для добавления пути

File To Add Path


Путь и содержимое ZIP-файла назначения:

Destination ZIP File Path and Contents


Содержимое Zip.zip ПослеПеречисленные выше команды выполнения:

After Running Command Listed Above


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

0 голосов
/ 21 марта 2019

Вот еще кое-что, что вы можете попробовать .. Я написал эту функцию для вас ..

Ссылку на функцию можно найти здесь.

function Add-ToZipFile {

    param(
        [Parameter(Mandatory)]
        [ValidateScript({
                    [System.IO.File]::Exists($_) -and [System.IO.FileInfo]::new($_).Extension -eq ".zip"

                    # YOU MUST SUPPLY AN EXISTING ZIP FILE PATH!!!
        })]
        [string]$ZipFilePath,

        [Parameter(Mandatory=$false)]
        [string[]]$FilesToAdd,

        [Parameter(Mandatory=$false)]
        [string[]]$FoldersToAdd
    )

    try {

        foreach($file in $FilesToAdd){
            if(Test-Path -Path $file -PathType Leaf) {
                Compress-Archive -Path $file -DestinationPath $ZipFilePath -Update
            } else {
                Write-Host "Unable to locate file: $($file) - Please make sure this file exists!" -f Red
            }
        }

        foreach($folder in $FoldersToAdd){
            if(Test-Path -Path $folder -PathType Container){
                $f = $folder.TrimEnd("\")
                $f = $f.TrimEnd("/")
                Compress-Archive -Path "$($f)" -DestinationPath $ZipFilePath -Update                             
            } else {
                Write-Host "Unable to locate folder: $($folder) - Please make sure this folder exists!" -f Red
            }
        }
    } catch {
        Write-Error "Something went wrong! Error: `r`n$($_)"    
    }
}

Вот как это можно использовать:

# MUST BE AN ARRAY OF STRINGS
# EVEN IF YOU HAVE A SINGLE PATH TO ADD, SURROUND IT IN '@( )' IN ORDER TO MAKE IT AN ARRAY
$files = @("C:\testing\SecondFileToAdd.txt")

# MUST BE AN ARRAY OF STRINGS 
$folders = @("C:\testing\toAdd", "C:\testing\anotherToAdd") 

# PATH TO ZIP FILE
$myZipPath = "C:\testing\zip\Zip.zip"

Add-ToZipFile -ZipFilePath $myZipPath -FilesToAdd $files -FoldersToAdd $folders

Пожалуйста, дайте мне знать, если это не работает (хотя, в моем тестировании это работало просто отлично) ..

0 голосов
/ 20 марта 2019

Вот эта строка:

Compress-Archive -Path $Env:BUILD_SOURCESDIRECTORY\MyProject\API\temp\* -Update -DestinationPath $Env:BUILD_ARTIFACTSTAGINGDIRECTORY\MyProject.API.zip

Вы предлагаете ему обновить существующий zip-файл, чтобы он добавлял элементы в zip-файл, включая содержимое, которое вы добавили в \ API \ temp здесь:

Copy-Item -Path $Env:BUILD_SOURCESDIRECTORY\MyProject\WEB\temp1\* -Destination $(Get-ChildItem -Path $Env:BUILD_SOURCESDIRECTORY\MyProject\API\temp -Directory -Recurse | ? {$_.Basename -eq 'MyDestinationFolder'} | % { $_.FullName}) -Recurse -Force

По сути, создайте новый zip-файл или удалите -update из своего compress-archive командлета. Или вы можете проверить, существует ли файл, а если нет - заархивировать его. Используйте командлет Test-Path, чтобы проверить это.

...