使用 PowerShell 仅复制每组同一文件的最后一个文件
Copying Only The Last File Of Each Group Of The Same File Using PowerShell
我 运行 遇到构建遗留应用程序的 Bamboo 部署的问题。该应用程序具有相同 DLL 的多个版本,因此当它们在部署过程中作为工件复制过来时,它们会不必要地相互覆盖,从而额外增加 15 分钟的部署时间。
这是我选择和复制所需 DLL 的原始方法:
Get-ChildItem $sourcePath -Include $includedDlls -Recurse |
Copy-Item -Destination $applicationDestinationRoot -Force
在花费数小时研究和拼凑不同的 PS 脚本后,我组装了一个解决方案:
Get-ChildItem $sourcePath -Include $includedDlls -Recurse |
Group-Object BaseName |
ForEach-Object {$_.Group[-1] | Copy-Item -Destination $applicationDestinationRoot -Force}
首先,我必须按文件的基本名称对文件进行分组。然后取每个DLL的分组对象。最后,仅选择每个 DLL 的最后一个 FullName 路径并将其复制到远程服务器目标。
随后,如果您想获取第一个文件而不是最后一个文件,只需将 $_.Group[-1]
替换为 $_.Group[0]
。
编辑:我已经用@Ansgar Wiechers 的较短版本的代码更新了我的答案。
我 运行 遇到构建遗留应用程序的 Bamboo 部署的问题。该应用程序具有相同 DLL 的多个版本,因此当它们在部署过程中作为工件复制过来时,它们会不必要地相互覆盖,从而额外增加 15 分钟的部署时间。
这是我选择和复制所需 DLL 的原始方法:
Get-ChildItem $sourcePath -Include $includedDlls -Recurse |
Copy-Item -Destination $applicationDestinationRoot -Force
在花费数小时研究和拼凑不同的 PS 脚本后,我组装了一个解决方案:
Get-ChildItem $sourcePath -Include $includedDlls -Recurse |
Group-Object BaseName |
ForEach-Object {$_.Group[-1] | Copy-Item -Destination $applicationDestinationRoot -Force}
首先,我必须按文件的基本名称对文件进行分组。然后取每个DLL的分组对象。最后,仅选择每个 DLL 的最后一个 FullName 路径并将其复制到远程服务器目标。
随后,如果您想获取第一个文件而不是最后一个文件,只需将 $_.Group[-1]
替换为 $_.Group[0]
。
编辑:我已经用@Ansgar Wiechers 的较短版本的代码更新了我的答案。