2009-04-26 8 views
11

Da documentazione:confuso con il parametro -Include del cmdlet Get-ChildItem

-Include

recupera solo gli elementi specificati. Il valore di questo parametro qualifica il parametro Path. Immettere un percorso elemento o motivo, ad esempio "* .txt". I caratteri jolly sono consentiti.

Il Includere parametro è valido solo quando il comando include il parametro Recurse o il percorso conduce il contenuto di una directory , come ad esempio C: \ Windows *, dove il carattere jolly specifica i contenuto del C: \ directory di Windows.

Il mio primo accordo era:

c:\test\a.txt 
c:\test\b.txt 

Quindi, per ottenere 'a.txt' e 'b.txt' posso scrivere:

gci -Path "c:\test\*" -Include "*.txt" 

E questo funziona. Ma ora prendere in considerazione tale gerarchia:

c:\test\a.txt 
c:\test\b.txt 
c:\test\c.txt\c.txt 

lo stesso comando restituisce: a.txt, b.txt, c.txt

La logica attuale sembra essere:

-Include usato per abbinare tutte le entità specificate da -Path. Se l'elemento corrispondente è un file, restituirlo. Se abbinato elemento è una cartella, guardare dentro e ritorno corrispondenza primi bambini di livello.

Inoltre, la documentazione dire:

Il Includere parametro è valido solo quando il comando include il parametro Recurse o sentiero conduce il contenuto di una directory ...

Questo è sbagliato pure. Per esempio.

gci -Path "c:\test" -Include "*.txt" 

Non restituisce nulla, mentre senza -Include ottengo il contenuto della cartella. Quindi -Include è sicuramente "efficace". Cosa succede veramente qui? Il parametro -Path specifica "c: \ test" e l'opzione -Include cerca di trovare questo percorso. Poiché "* .txt" non corrisponde a "test", quindi non viene restituito nulla. Ma guardate questo:

gci -Path "c:\test" -Include "*t" 

Esso restituisce a.txt, b.txt e c.txt come "* t" abbinato "test" e abbinati tutti gli elementi figlio.

Dopo tutto, anche sapere come prevede brani ora, non capisco quando utilizzarlo. Perché ho bisogno di cercare all'interno delle sottocartelle? Perché dovrebbe essere così complesso?

risposta

14

Stai confondendo l'uso di -include.Il flag -include viene applicato al percorso, non al contenuto del percorso. Senza l'uso del flag ricorsivo, l'unico percorso in questione è il percorso specificato. Questo è il motivo per cui l'ultimo esempio che hai dato funziona, il percorso c:\test ha una t nel percorso e quindi corrisponde a "*t".

è possibile verificare questo cercando il seguente

gci -path "c:\test" -in *e* 

Questo sarà ancora produrre tutti i bambini nella directory eppure corrisponde nessuno dei loro nomi.

La ragione per cui il parametro recurse è più efficace è che si finisce per applicare il carattere jolly a ogni percorso della gerarchia.

+0

Sto usando PowerShell-v2.0-CTP3 e l'esempio produce set vuoto. – alex2k8

+0

@ alex2k8, Non sono sicuro di cosa dire qui. Ho provato questo esempio su 1.0 e una versione successiva 2.0, entrambi producono gli stessi risultati. – JaredPar

+0

@Jared, questo è strano. Per favore, puoi provare gci -path c: \ * -in *. Vedo i bambini di c: \ e tutte le sue sottocartelle a un livello inferiore. Ecco la descrizione simile http://www.eggheadcafe.com/software/aspnet/32624832/getchilditem-include-qu.aspx – alex2k8

4

Tacking su JaredPar's answer, per eseguire la corrispondenza del modello con Get-ChildItem, è possibile utilizzare i caratteri jolly della shell comune.

Ad esempio: "?"

get-childitem "c:\test\t?st.txt" 

dove la è un jolly corrispondenza qualsiasi carattere o

get-childitem "c:\test\*.txt" 

che corrisponderà qualsiasi nome di file che termina in ".txt".

Questo dovrebbe ottenere il comportamento "più semplice" che stavi cercando.

+0

Non è il problema qui che è possibile ottenere una sola estensione? -Include è string [] che consente più varianti di corrispondenza. Grazie, Ben –

9

Prova il parametro -filter (che ha il supporto per una sola estensione):

dir -filter * .txt

+5

Il filtro è leggermente diverso perché è un'implementazione specifica del provider. In genere è più efficiente perché si verifica prima che i dati vengano restituiti. Ma ha un'implementazione diversa per ogni provider di unità in PowerShell. Quindi ci possono essere sottili differenze nell'algoritmo di corrispondenza. – JaredPar

+0

Sono d'accordo, anche se in questo caso stiamo parlando del provider del file system. Thnaks per il commento. –

2

ho solo fatto una domanda simile e ottenuto tre risposte veloci che regolano l'Get-Help per Get- ChildItem.

La risposta è nella descrizione completa del comando (Get-Help Get-ChildItem -full):

The Include parameter is effective only when the command includes the 

parametro Recurse o il percorso porta a il contenuto di una directory, come C: \ Windows *, dove il carattere jolly specifica il contenuto di nella directory C: \ Windows.

Quindi quanto segue funzionerebbe senza recurse.

PS C: \ path foo> Get-ChildItem "c: \ foo *" * .txt -Include

Da Stack Overflow questione PowerShell Scripting - Get-ChildItem.

Spero che questo aiuta :-)

+0

Ben, in realtà la mia domanda era un po 'diversa. Si noti che l'esempio restituirà i file .txt dalla cartella foo, ma può anche restituire in modo imprevisto file e persino cartelle dalla directory "c: \ foo \ dir.txt". Prova tale gerarchia: c: \ pippo \ dir.txt \ file.txt e c: \ pippo \ dir.txt \ dir2.txt \ file2.txt. Otterrai: file.txt e dir2.txt! – alex2k8

0

Compreso \* alla fine del percorso dovrebbe aggirare il problema

PS C:\logfiles> Get-ChildItem .\* -include *.log 

Ciò dovrebbe restituire.file di registro dalla directory di lavoro corrente (C:\logfiles)

L'esempio di Alex sopra indica che verrà restituita anche una directory con il nome foo.log. Quando l'ho provato, non lo era ma sono passati 6 anni e questo potrebbe provenire dagli aggiornamenti PS.

Tuttavia, è possibile utilizzare l'elemento figlio Mode per escludere le directory, penso.

PS C:\logfiles> Get-Childitem .\* -include *.log | where-object {$_.mode -notmatch "d"} 

Questo dovrebbe escludere qualsiasi cosa con la modalità 'directory' impostata.

+0

L'inclusione di \ * alla fine del percorso non sempre funziona. Non conosco alcun modo per specificare un valore -Include per abbinare i file che non hanno l'estensione del nome file. Specificando * come modello -Include si abbinano a tali file, ma rende Get-ChildItem agire in modo ricorsivo. Se -Include si comporta allo stesso modo di Escludi, sarebbe facile. – MikeOnline