GitHub Actions PowerShell搜索归档耗时优化及Exclude失效求助
解决GitHub Actions PowerShell工作流中排除目录和文件无效的问题
问题根源
-Exclude参数的局限性:Get-ChildItem的-Exclude默认只对当前层级的条目名生效,递归时不会阻止进入指定排除目录(比如DevOps),只会排除根目录下名为DevOps的条目,而目录内的文件依然会被遍历到。- 未启用扩展名排除:原代码定义了
$excludeExtensions但未在过滤逻辑中使用,导致.java、.class文件未被排除。 - 未处理输入列表空格:若
itemsToInclude包含带空格的条目,直接分割会导致匹配失败。
解决方案
修改文件过滤逻辑,直接通过文件完整路径排除目标目录,同时加入扩展名过滤,并处理输入列表的空格:
$zipFileName = "${{ github.workspace }}\package-$env:GITHUB_RUN_NUMBER.zip" cd "${{ github.workspace }}" $itemsToInclude = $env:INPUTS_FILESINZIP Write-Host "itemsToInclude is- $itemsToInclude" $workspace = "${{ github.workspace }}" # 定义要排除的目录和扩展名 $excludeDirectory = 'DevOps' $excludeExtensions = @('.java', '.class') # 处理输入列表,去除条目前后空格 $itemsToIncludeList = $itemsToInclude -split ',' | ForEach-Object { $_.Trim() } Write-Host 'Include specific files and folders as per the comma-separated list' # 过滤文件:排除指定目录、指定扩展名,仅保留目标文件名 $filesToInclude = Get-ChildItem $workspace -Recurse -File | Where-Object { # 跳过DevOps目录下的所有文件 -not $_.FullName.StartsWith((Join-Path $workspace $excludeDirectory), [System.StringComparison]::OrdinalIgnoreCase) -and # 排除指定扩展名的文件 -not $excludeExtensions.Contains($_.Extension) -and # 检查文件名是否在包含列表中 $itemsToIncludeList -contains $_.Name } $filesToInclude | ForEach-Object { $newZipEntrySplat = @{ EntryPath = $_.FullName.Substring($workspace.Length) SourcePath = $_.FullName Destination = $zipFileName } Write-Host "Adding file: $($_.FullName)" New-ZipEntry @newZipEntrySplat } Write-Host "Zip file created: $zipFileName" env: INPUTS_FILESINZIP: ${{ inputs.filesinzip }}
优化说明
- 目录排除逻辑:通过
$_.FullName.StartsWith直接判断文件是否位于DevOps目录下,从根源跳过该目录的所有文件,减少不必要的遍历操作,大幅缩短耗时。 - 扩展名过滤:加入
-not $excludeExtensions.Contains($_.Extension),直接排除不需要的文件类型。 - 输入列表处理:用
ForEach-Object { $_.Trim() }去除条目前后空格,避免因输入格式问题导致匹配失败。 - 移除冗余代码:删除提前创建空ZIP文件的逻辑,
New-ZipEntry会自动生成不存在的ZIP文件。
内容的提问来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

