Question Exclure les Reparse points d'une recherche...

Plus d'informations
il y a 15 ans 2 mois #9181 par Thierry
Bonjour,

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...:S

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...:angry:

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.

Plus d'informations
il y a 15 ans 2 mois #9183 par xyz
Salut,
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.

Plus d'informations
il y a 15 ans 1 mois #9256 par Thierry
Merci pour cette réponse...

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.

Plus d'informations
il y a 15 ans 1 mois #9276 par xyz
thierry92 écrit:

Je vais finir par croire que je n'y arriverai pas sans toi :)

Je n'ai fait que te donner une info.
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 :

j'ai tenté d'utiliser \&quot;where-objet\&quot; 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...

De mon côté, sûrement la fatigue ...

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 1 mois #9285 par Thierry
Bonsoir,

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 \&quot;.lnk\&quot; 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\&quot; 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 \&quot;présents\&quot; dans les RP. Au final, j'arrive à exclure les \&quot;.lnk\&quot; 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 \&quot;Reparse point\&quot;...

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.

Plus d'informations
il y a 15 ans 1 mois #9306 par xyz
Désolé, je n'ai pas le temps de créer un jeux des tests.
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.

Temps de génération de la page : 0.044 secondes
Propulsé par Kunena