在下面的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."
}
}
答案 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个文件:Zip.zip
New Text Document 1.txt
我所要做的就是运行以下命令,将New Text Document 2.txt
“注入” FileToAdd.txt
:
Zip.zip
以下屏幕截图:
要添加路径的文件
目标ZIP文件的路径和内容:
Compress-Archive -Path C:\testing\toAdd\* -DestinationPath C:\testing\zip\Zip.zip -Update
的内容:
希望这会有所帮助!
答案 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
请让我知道这是否行不通(尽管在我的测试中行之有效)。