Question
Exclure les Reparse points d'une recherche...
- Thierry
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 42
- Remerciements reçus 0
J'effectue des recherches sur un disque branché en USB contenant un système d'exploitation Windows à l'aide de \"Get-childItem\", malheureusement je me suis rendu compte que le résultat de ces recherches comprenait aussi des fichiers présents sur mon ordinateur....ce qui m'a quand même surpris...
Après recherches je me suis rendu compte que les \"Reparse Point\" pouvaient être en cause, en effet le disque USB (lettre \"e:\\") contient par exemple un dossier \"All users\" qui renvoit vers \"c:\programdata\" (donc indirectement vers mon système d'exploitation)...le mystère était levé....pour autant la solution n'est pas trouvée...
Précisément je recherche les fichiers \".lnk\" présents sur le disque USB et seulement sur celui-ci je veux donc exclure de ma recherche ceux qui en réalité sont sur ma partition c:\...
ma commande :
[code:1]$lnk = @(Get-ChildItem -literalpath \"$source\" -recurse -force -erroraction silentlycontinue -filter \"*.lnk\" )[/code:1]
Voyez-vous une solution pour éviter la prise en compte de ces Reparse point ?
Je vois bien qu'il faut jouer sur l'attribut \"FILE_ATTRIBUTE_REPARSE_POINT\" mais je n'arrive pas à l'inclure dans ma requête...
merci beaucoup pour votre aide.
Thierry
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
tu peux utiliser les cmdlets du projet PScx :
[code:1]..\WindowsPowerShell\Modules\Pscx\Modules\FileSystem\Pscx.FileSystem.Format.ps1xml
..\WindowsPowerShell\Modules\Pscx\Modules\FileSystem\Pscx.FileSystem.Type.ps1xml[/code:1]
Sinon il faut ajouter une clause Where-Object et tester les attributs du fichiers, voir ce post .
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Thierry
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 42
- Remerciements reçus 0
Je vais finir par croire que je n'y arriverai pas sans toi
J'ai pris le temps de faire quelques essais avant de répondre d'où ma réponse un peu tardive.
Au final :
- je ne peux recourir aux cmdlts du projet PScx car je ne maîtrise pas les machines sur lesquelles le script va être exécuté
- j'ai tenté d'utiliser \"where-objet\" pour limiter ma recherche mais mon résultat n'est pas concluant car si j'arrive à identifier et à exclure les dossiers qui sont des RP, je n'arrive pas à éviter que les dossiers qu'ils contiennent (et qui ne sont pas des RP) soient également exclus de ma recherche...
- j'ai donc choisi une démarche qui manque certainement de classe et qui prend un peu plus de temps mais au final cela marche...
1/ on liste tous les RP et on conserve leurs chemins dans une variable
2/ on liste tous les fichiers \".lnk\" et on conserve leurs chemins dans une variables
3/ on compare les des deux variables à l'aide de boucles imbriquées et on ne garde que les chemins des \".lnk\" qui ne contiennent aucun des chemins vers des RP...
Voilà le code :
[code:1]#
# 1 - Recherche de tous les .lnk
#
# On liste les dossiers constituant des Reparse Point :
#
$RPfolders = @()
$RPfolders = get-childitem \"$source\" -recurse -force -erroraction silentlycontinue | where-object { ($_.psiscontainer -eq $true) -and ( $_.Attributes -match \"reparsepoint\" ) }
# On liste tous fichiers \".lnk\" présents sur la source :
#
$lnk = @()
$lnk = Get-ChildItem $source -filter \"*.lnk\" -force -recurse -erroraction silentlycontinue
# comparaison :
#
# on compare chaque lien avec chaque chemin vers un dossier RP
# si le le lien contient le chemin vers le RP, on l'exclut le lien car c'est un doublon
# sinon on le garde
$doublon = 0 # Variables pour définir ou non la correspondance
$lnkfinal = @() # variable pour le listing final des liens
$i = 1
foreach ($line in $lnk) # pour chaque liens découvert
{
foreach ($element in $RPfolders) # on le compare avec chaque chemin de dossier RP
{
if ( $($line.fullname) -like \"*$($element.fullname)*\" ) # si chemin lien contient le chemin RP on exclu le lien en mettant $doublon a 1
{
$doublon = 1
} # fin if
} # fin foreach $element
if ($doublon -eq 0) # si le chemin vers le lien est valide on l'ajoute à $lnkfinal
{
$lnkfinal += $line
}
$doublon = 0
$i ++
} # fin foreach line
[/code:1]
N'hésitez pas à commenter ou critiquer
Thierry
Message édité par: thierry92, à: 24/03/11 14:12<br><br>Message édité par: thierry92, à: 24/03/11 14:14
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Je n'ai fait que te donner une info.Je vais finir par croire que je n'y arriverai pas sans toi
Pour PSCX j'ai cité les fichier ps1xml, car ils contiennent des membres adaptés utilisant ces attributs.
Ces derniers temps, c'est vrai que je ne suis pas très explicite et vais à l'essentiel.
Sinon je n'ai pas compris ceci :
De mon côté, sûrement la fatigue ...j'ai tenté d'utiliser \"where-objet\" pour limiter ma recherche mais mon résultat n'est pas concluant car si j'arrive à identifier et à exclure les dossiers qui sont des RP, je n'arrive pas à éviter que les dossiers qu'ils contiennent (et qui ne sont pas des RP) soient également exclus de ma recherche...
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Thierry
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 42
- Remerciements reçus 0
En fait ma première remarque visait principalement tes précédentes réponses à d'autres de mes questions...bref tu m'as déjà permis de régler plusieurs problèmes
Pour le reste :
L'idée de ma recherche est de trouver tous les \".lnk\" présents sur une partition montée mais en omettant les doublons liés aux reparse points.
En fait je voudrais faire ceci :
- cherche les .lnk\" sur toute la partition
- mais ne prend pas en compte les dossiers constituant des reparse Point (j'y arrive avec Where-object)
- et aussi ne prend pas en compte dans la recherche les sous-dossiers \"présents\" dans les RP. Au final, j'arrive à exclure les \".lnk\" qui sont dans le dossier vers lequel pointe le RP (dossier X) mais pas ceux présents dans les sous-dossiers du dossier X car ceux-ci ne possèdent pas d'attribut \"Reparse point\"...
C'est cette dernière condition que je n'arrive pas à mettre en forme d'où ma solution détournée...
J'espère que c'est un peu plus clair.
Dans tous les cas, merci.
Thierry
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Saurais-tu en créer un par script à l'aide d'outils externe ?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Exclure les Reparse points d'une recherche...