Powershell脚本在复制文件时复制目标文件夹中的现有文件

时间:2019-03-20 14:50:42

标签: azure powershell azure-devops azure-pipelines

在下面的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 :(得分:0)

是这一行:

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 cmdlet中删除compress-archive。或者,您可以检查文件是否存在,如果不存在,则将其压缩。使用Test-Path cmdlet进行检查。

答案 1 :(得分:0)

因此,您无需解压缩MyProject.API.zip,然后向其中添加文件,然后重新打包,即可向其中注入文件...您可以在现有的{{ 1}}文件。

这是我对其进行测试的方式:(您应该能够按照以下步骤进行操作,以实现您要完成的任务,我使用了这些步骤,因为它们易于遵循):< / p>

  • .zip创建了一个目录和文件(这模拟了我 要注射)
  • C:\testing\toAdd\FileToAdd.txt创建了一个目录和Zip文件(这模拟了我的.zip文件所在的位置)
  • C:\testing\zip\Zip.zip文件中有2个文件:
    1. Zip.zip
    1. New Text Document 1.txt

我所要做的就是运行以下命令,将New Text Document 2.txt“注入” FileToAdd.txt

Zip.zip

以下屏幕截图:


要添加路径的文件

File To Add Path


目标ZIP文件的路径和内容:

Destination ZIP File Path and Contents


运行上面列出的命令后,

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

After Running Command Listed Above


希望这会有所帮助!

答案 2 :(得分:0)

这是您可以尝试的其他方法。.我为您编写了此函数。

Link to function can be found here.

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

请让我知道这是否行不通(尽管在我的测试中行之有效)。