2016-07-25 34 views
0

以前はこのスクリプトを正常に実行していましたが、最近はconfigトランスフォームステップでいくつかの問題が発生しています私たちのTFS Buildから。Powershell:指定されたパスまたはファイル名、またはその両方が長すぎます - ディレクトリ除外

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

Error in TFS

我々は最近、私たちに「node_modules」フォルダを与えている私たちのCSSやJSをコンパイルするがぶ飲みを使用してに切り替えました。これらのフォルダをクロールしようとしているように見え、実際にはディレクトリの長さ制限に達しています。私はグーグルや他の関連する質問から見つかったさまざまな提案を試しましたが、私にとってはうまくいかないようですが、それでも同じエラーが発生しています(実際にはこれらのフォルダを除外しているとは限りません)。

これは私が他のSOの質問と回答をもとに、この上でいくつかのバリエーションを試してみた

$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*' } 

フォルダを除外するために使用してみました修正版の例ですが、解決策は私を忌避します。私はいくつかの情報源から多くの人のために多くの人々のために働かない-Excludeを読んだので、私はフォルダを除外するwhere節の解決策を試しました(私は複数を除外したいですが、node_modulesを

私はnode_modulesディレクトリと、変換をチェックする必要がないいくつかの他のものを除外したいと思います。どんな助けでも大歓迎です、ありがとうございます。

+1

**コードにはイメージを使用しません。あなたが問題を解決するまで、標準的な書式設定ツールを使って実際のコードを投稿してください(** -1)。私は何か明確なものはありませんが、タイトルを見たときの最初の考えは "node_modules"それはあなたの排除物の中にあります。node_modulesはネストされた階層を作成する傾向があります。ネストされた階層は、Windowsファイルの長さの制限が深刻になり始めます。 – jpmc26

+0

実際、あなたのために何か。私はそれのドキュメントを見つけるのに苦労していますが、思い出したように、 '-Exclude'は、基本システムがすべてのファイルを取得した後*処理されます。したがって、 '-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のようなサードパーティのいくつかのランタイムは気にしません。

関連する問題