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-ArchiveCompress-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-ArchiveCompress-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脚本加载到另一个?

使用 Powershell 将 Excel 工作表从一个工作簿复制到另一个工作簿

powershell 这会将列表从一个SharePoint站点复制到另一个SharePoint站点

sh 用于将环境变量从现有heroku应用程序复制到另一个应用程序的脚本