2016-07-25 307 views
0

我們以前一直在使用此腳本,但最近我們在使用我們的配置轉換步驟時遇到了一些問題(請參閱下面的錯誤)來自我們的TFS Build。Powershell:指定的路徑或文件名或兩者都過長 - 目錄排除

$serviceFiles = Get-ChildItem $localWorkspace -Recurse | where {$_.Extension -eq ".exe"} 

Error in TFS

最近,我們切換到使用咕嘟咕嘟編譯我們的CSS和JS這給了我們一個「node_modules」文件夾中。它看起來像試圖抓取這些文件夾,實際上達到目錄長度限制。我嘗試了各種建議,我發現從谷歌搜索和其他相關的問題上,但沒有人似乎爲我工作,它仍然發生相同的錯誤(並且我認爲實際上並不排除這些文件夾)

這是我嘗試使用排除

$excludedDirectories = @("*node_modules*", "*packages*", "*Common*"); 
Write-Verbose $localWorkspace 

# get services for config types (service configs named same as assmebly .exe) 
$serviceFiles = Get-ChildItem $localWorkspace -Recurse -Exclude $excludedDirectories | ?{$_.Extension -eq ".exe" -and $_.FullName -notmatch '*node_modules*' } 

我已經試過這方面的一些變化基於其他SO問題和答案的文件夾的修改版本的例子,但解決的辦法逃避我。我從幾個來源讀到,-Exclude在大多數情況下不適用於很多人,所以我嘗試了where子句的解決方案來排除文件夾(我想排除多個文件夾,但我只是嘗試了node_modules看看我是否可以通過它,其他文件夾不是太深)

我想排除node_modules目錄,以及其他一些不需要檢查的轉換。任何幫助將不勝感激,謝謝。

+1

**不*使用圖片代碼。使用標準的格式化工具發佈實際的代碼**(-1直到你解決這個問題。)解決你的問題:我沒有明確的提議,但是當我看到標題時我的第一個想法是「node_modules」看不見,那裏是你的排除。node_modules傾向於創建如此深的嵌套層次結構,並開始運行到Windows文件長度限制之內。 – jpmc26

+0

其實,給你一些東西。我很難找到它的文檔,但是正如我記得的那樣,在底層系統獲得所有文件後,會處理'--Exclude'。所以' - 排除'不起作用。 – jpmc26

+0

謝謝,我用代碼片段而不是圖片修改了我原來的帖子。 – ICTech

回答

2

不幸的是,在枚舉所有文件之前,-Exclude參數不會排除目錄。所以它仍然錯誤。你需要先排除它們。

如果這些目錄僅存在於頂層,則可以枚舉頂層目錄,排除不需要的目錄,然後檢查剩餘目錄中的內容。就像這樣:

$excludedDirectories = @("node_modules", "packages", "Common") 

$serviceFiles = Get-ChildItem $localWorkspace -Exclude $excludedDirectories | % { Get-ChildItem $_ -Recurse } | ? {$_.Extension -eq ".exe" } 

另外,還可以通過使用-Include使這個簡單一點:

$serviceFiles = Get-ChildItem $localWorkspace -Exclude $excludedDirectories | % { Get-ChildItem $_ -Recurse -Include "*.exe" } 

通知我做了什麼。我刪除了頂層-Recurse並過濾掉了這些目錄。然後我使用-Recurse對最頂級父母的其餘孩子給我們我們正在尋找的文件。

如果您需要過濾掉的目錄層次結構中或在多個層面出現深,你必須寫自己的遞歸遍歷功能:

function Get-ChildItemRecursiveExclude(
    [Parameter(Mandatory=$true)][string[]]$Path, 
    [Parameter(Mandatory=$true)][string[]]$ExcludedDirNames 
) { 
    $immediateChildren = Get-ChildItem $Path -Exclude $ExcludedDirNames 
    foreach ($c in $immediateChildren) { 
     # Uncaptured output is returned 
     $c 
     if (Test-Path $c -PathType Container) { 
      Get-ChildItemRecursiveExclude $c $ExcludedDirNames 
     } 
    } 
} 

$serviceFiles = Get-ChildItemRecursiveExclude $localWorkspace @("node_modules", "packages", "Common") | ? { $_.Extension -eq ".exe" } 

總體而言,其基本思想是,你有以防止PowerShell首先進入node_modules。 npm創建超過路徑長度的舊限制的非常深的層次結構。 (我並不清楚爲什麼.NET仍然強制執行它們,但是即使一些底層的Windows API不再執行它,例如robocopy和幾個第三方運行時(如Node)也不會打擾它們。)

相關問題