Powershell将文件从环境变量复制到另一个环境变量的zip文件夹
Posted
技术标签:
【中文标题】Powershell将文件从环境变量复制到另一个环境变量的zip文件夹【英文标题】:Powershell copy file from an environment variable to the zip folder of another environment variable 【发布时间】:2018-05-02 13:50:22 【问题描述】:我是 Powershell 的新手,想将文件从 BUILD_SOURCESDIRECTORY 环境变量复制到我的 VSTS 构建定义中的 BUILD_STAGINGDIRECTORY 环境变量内的 zip 文件夹。
if(Test-Path $Env:BUILD_SOURCESDIRECTORY/MyFolder/MyFIle.txt)
Write-Host "Source File: $Env:BUILD_SOURCESDIRECTORY/MyFolder/MyFIle.txt"
Write-Host "Target Location: $Env:BUILD_STAGINGDIRECTORY\StagingDirectoryFolder.zip\TestFolder"
将文件从一个路径复制到另一个路径非常简单,但我真的不知道如何将文件移动到 zip 文件夹结构中。
【问题讨论】:
PowerShell 和 .NET Framework 的版本是多少?虽然 Windows 资源管理器/文件资源管理器可以将 .zip 文件视为已集成到文件系统中,但 PowerShell 不能。某些版本的 .NET Framework 具有可用于操作 .zip 文件的对象类,但旧版本没有。 Powershell 版本:5,DotNetFramework:4 PS 5 还是 5.1? .NET 4、4.5、4.6.*、4.7?您应该将$psversiontable
的输出粘贴到您的问题中。
你需要解压zip;将文件移动到解压缩的文件夹中;然后重新拉上拉链。看Expand-Archive
和Compress-Archive
让我们退后一步:首先生成 zip 存档的原因是什么?为什么要在创建文件之后将其放入其中?
【参考方案1】:
如果我可以建议一个非 power shell 解决方案(尽管按照 cmets 的建议,值得查找 Expand-Archive 和 Compress-Archive cmdlet。)
我会使用Archive Files
构建任务来处理压缩。在您的 power shell 构建脚本中,将您的工件复制到 $ENV:BUILD_BINARIESDIRECTORY
,然后利用 VSTS 构建来归档所有文件。
然后,您可以使用 VSTS 构建发布该 zip 文件,这将允许通过 VSTS Web gui 轻松访问它,imo 提供了卓越的用户体验(用于对您的构建以及需要访问的其他用户进行故障排除)这些工件(物理人员或自动化流程))。如果您需要对 zip 文件执行其他操作,则可以在 archive files
之后添加另一个 powershell 脚本,以便能够从 $ENV:BUILD_ARTIFACTSTAGINGDIRECTORY
访问该文件。这样,您的脚本就可以保持简单,并且您可以将一些构建维护工作交给 Microsoft。
【讨论】:
【参考方案2】:您可以将MyFIle.txt
复制到Expand-Archive
和Compress-Archive
压缩文件下的子文件夹TestFolder
(如gvee 所述)。 PowerShell脚本如下:
if(Test-Path $(Build.SourcesDirectory)\MyFolder/MyFIle.txt)
clear-host
[string]$zipF = '$(Build.ArtifactStagingDirectory)\StagingDirectoryFolder.zip'
[string]$fileToZip = '$(Build.SourcesDirectory)\MyFolder\MyFIle.txt'
[string]$tempEx= '$(Build.SourcesDirectory)\temp'
[string]$copyDes='$(Build.SourcesDirectory)\temp\TestFolder'
Expand-Archive -Path $zipF -DestinationPath $tempEx -Force
Copy-Item $fileToZip -Destination $copyDes -Force
Compress-Archive -Path $tempEx\* -Update -DestinationPath $zipF
Remove-Item -Recurse -Force $tempEx
现在压缩文件$(Build.ArtifactStagingDirectory)\StagingDirectoryFolder.zip
在$(Build.ArtifactStagingDirectory)\StagingDirectoryFolder.zip\TestFolder
下包含MyFIle.txt
。
【讨论】:
我采用了类似的方法来完成它。尝试像您一样遵循可变方法,但由于某种原因它不起作用。它运行脚本文件(.ps1)没有错误,但不做任何事情。用我以前的直接路径方法替换变量,效果非常好。已标记您的答案!。 我的错误@Marina。你的答案是正确的。我错误地将 $Env:BUILD_SOURCESDIRECTORY 和 $Env:BUILD_STAGINGDIRECTORY 分配给我的变量,而不是 $(Build.SourcesDirectory) 和 $(Build.StagingDirectory)。确实很奇怪,Powershell 直接提供时接受 $Env:SOURCESDIRECTORY ,但通过变量提供相同时会抱怨。以上是关于Powershell将文件从环境变量复制到另一个环境变量的zip文件夹的主要内容,如果未能解决你的问题,请参考以下文章
在PowerShell中递归地将一组文件从一个目录复制到另一个目录
使用 PowerShell 将列从一个 csv 文件复制到另一个
使用 Powershell 将 Excel 工作表从一个工作簿复制到另一个工作簿