7 votes

Powershell Get-ChildItem Inclure\Exclure - script simple ne fonctionne pas correctement

Je essaie de exécuter le code suivant en tant que script powershell, mais je ne parviens pas à le faire fonctionner. En premier lieu, cela fonctionne avec un élément -Include, mais je n'arrive pas à le faire fonctionner avec plusieurs éléments. Deuxièmement, le paramètre -Exclude ne semble pas fonctionner. Je reçois toujours des fichiers des répertoires C:\Windows et C:\Program Files.

$Include = "*.zip","*.rar","*.tar","*.7zip"
$exclude = "C:\Windows","C:\Program Files"
Get-ChildItem "C:\" -Include $Include -Exclude $Exclude -Recurse -Force -ErrorAction silentlycontinue | Select-Object -ExpandProperty FullName

Remarque : Le but de ce script est de trouver tous les fichiers compressés sur le système. Je sais que c'est probablement très simple, mais je n'arrive juste pas à le faire fonctionner.

5voto

LotPings Points 6795

Je suis d'accord avec dangph que l'option -exclude ne fonctionne pas comme prévu.
Lorsque vous utilisez -notmatch, vous pouvez construire un modèle regex avec un ou |.
Cela fonctionne ici avec le $include révisé :

$Include = @('*.zip','*.rar','*.tar','*.7zip')
$exclude = [RegEx]'^C:\\Windows|^C:\\Program Files'
Get-ChildItem "C:\" -Include $Include -Recurse -Force -EA 0| 
  Where FullName -notmatch $exclude|
  Select-Object -ExpandProperty FullName

EDit Étant donné que les dossiers exclus sont de premier niveau, il est beaucoup plus rapide de ne pas les parcourir du tout, donc une approche en deux étapes est plus efficace :

$Include = @('*.zip','*.rar','*.tar','*.7zip')
$exclude = [RegEx]'^C:\\Windows|^C:\\Program Files'

Get-ChildItem "C:\" -Directory |
  Where FullName -notmatch $exclude|ForEach {
  Get-ChildItem -Path $_.FullName -Include $Include -Recurse -Force -EA 0| 
  Select-Object -ExpandProperty FullName
}

0 votes

Une fois que j'ai retiré le -Force et le -EA 0, cela a fonctionné. Je ne sais pas pourquoi? Merci.

0 votes

Désolé pour cela, différences de version de PowerShell. Les deux sont pris en charge dans les versions supérieures. -EA 0 est juste une abréviation pour -ErrorAction silentlycontinue

3voto

ugasoft Points 1280

Le paramètre -Exclude n'a jamais vraiment fonctionné correctement. Il semble qu'il corresponde à la propriété Name, ce qui n'est généralement pas très utile. Vous devez probablement faire le filtrage vous-même :

$Include = "*.zip","*.rar","*.tar","*.7zip"
Get-ChildItem "C:\" -Include $Include -Recurse -Force -ErrorAction silentlycontinue | 
    ? { $_.FullName -notmatch "^C:\\Windows" -and $_.FullName -notmatch "^C:\\Program" } |
    Select-Object -ExpandProperty FullName

(Soit dit en passant, -Filter est bien plus rapide que -Include. L'inconvénient est que vous ne pouvez pas lui donner un tableau de motifs comme vous le pouvez avec -Include. Mais cela pourrait quand même être plus rapide même si vous deviez effectuer quatre recherches. Je ne pourrais pas le dire avec certitude. Il pourrait être utile de tester si la vitesse est importante pour vous.)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X