2015-11-13 13 views
7

In questo momento ho aggiornato a Windows 10 TH2 Costruire 10586 con PowerShell 5.0.10586.0PowerShell 5 Get-ChildItem LiteralPath non funziona con includono più

Ora ho un problema con Get-ChildItem

$files = Get-ChildItem -LiteralPath $path -Force -Recurse -Include *.txt 

Restituisce TUTTI i file in $ path anche se non sono .txt. Questo funzionava prima dell'aggiornamento. Quando cambio a

$files = Get-ChildItem -Path $path -Force -Recurse -Include *.txt 

funziona di nuovo. Ma non è quello che voglio. Si tratta di un errore o sto facendo qualcosa di sbagliato?

+1

cos'è $ path in là, ha \ alla fine? –

+0

Ho provato entrambi. Con e senza \ alla fine. Non fa alcuna differenza –

risposta

4

Personalmente, I mai utilizzare -Include o -Exclude. Condico sempre attraverso Where-Object. Non so se l'autore di -Include e -Exclude era pazzo o se c'è un problema con il provider .Net sottostante, ma sono traballanti come l'inferno.

Sono al 5.0.10240.16384.

gci -Path $path -Include *.txt -Force 

Non restituisce nulla.

gci -LiteralPath $path -Include *.txt -Force 

Restituisce tutto in $path.

gci -LiteralPath $path -Include *.txt -Force -Recurse 
gci -Path $path -Include *.txt -Force -Recurse 

Entrambi restituiscono * .txt in $path e tutte le sottocartelle.

Quindi qual è il comportamento corretto dovrebbe essere? Il flag -Recurse modifica come funziona -Include? Non lo so. Non mi interessa più Non ho intenzione di affrontare questo tipo di comportamento. Mi basta usare questo:

gci -Path $path -Recurse -Force | Where-Object { $_.Extension -eq '.txt' } 

Mi affido Get-ChildItem per enumerare i file e le cartelle e basta. Dammi solo gli oggetti e li filtrerò. Come tutti i vecchi bug Remove-Item -Recurse, c'è qualcosa che non funziona proprio nel modo in cui la gente si aspetta di farlo.

+0

-Include solo funziona con -Recurse. –

+0

@MarcFauser Hm, hai ragione. [Il documento] (https://technet.microsoft.com/en-us/library/hh849800.aspx) dice anche che '-Include' modifica l'argomento' -Path' e non dice nulla sull'argomento '-LiteralPath'. Cristo, perché questo cmdlet non emette errori per sintassi non supportata? E non ho idea di cosa fare dell'Esempio 3, che parla esplicitamente dell'uso di '-Path' e' -Include' senza '-Recurse'! Ancora una volta mi viene chiesto: "Qual è il comportamento corretto dovrebbe essere?" Probabilmente inserirò su Microsoft Connect, per tutto il bene che farà. –

+0

@BaconBits probabilmente conosce questo 2 anni, ma per le persone che visitano la risposta è che il cmdlet non conosce la sintassi non supportata - li passa solo al sottosistema del provider PS - il comportamento jolly per il filesystem PS Provider è diverso dal provider di registro e dal provider ActiveDirectory, ecc. E sospetto che sia anche il motivo per cui è "sfacchettato come un matto" - perché i caratteri jolly del filesystem sono retrocompatibili con Windows 3 o con MS-DOS. È anche il motivo per cui i doc non possono dire molto ma "qualifica il percorso" perché dipende dall'implementazione di PSProvider. – TessellatingHeckler