Question Recherche mots-clés dans le nom d'un fichier

Plus d'informations
il y a 9 ans 5 mois #22531 par Speed83
Bonjour,

Je souhaite réaliser une recherche dans le nom d'un fichier avec des mots-clés contenu dans un fichier texte.
Si le nom de fichier contient un des mots-clés alors je souhaite copier le fichier dans un répertoire précis.

Les mots-clés seront organisés par ligne avec à chaque fin de ligne le répertoire cible.
Ce fichier texte contenant les mots-clés sera de ce type:

mot-cle1, motcle2, motcle3,... dossier:c:\docs\1
mot-cle1, motcle2, motcle3,... dossier:c:\docs\2


Je commence déjà à essayer de pouvoir faire matcher les mots contenus dans le nom du fichier avec les mots-clés contenus dans le fichier mais je bloque

Je pensai pouvoir réaliser cela avec un select-String qui pourrait en plus me renvoyer le numéro de la ligne et ainsi récupérer par la suite le chemin du répertoire pour la copie.

Voici un exemple de mon code :
[code:1]$FichierMotCle = 'c:\docs\FichierMotCle.txt'
$NomFichCible = $Fichier.Name.ToString()
$test = Select-String $FichierMotCle -Pattern $NomFichCible[/code:1]

Je n'arrive pas à utiliser les mots-clés contenus dans le fichier.
De plus, avec l'option -Pattern d'après ce que j'ai testé, il faut que le nom du fichier contienne la totalité des mots clés alors que je souhaiterai que si un seul mot-clé correspond alors je copie le fichier.

J'ai également réalisé des tests avec [code:1]Get-Content $FichierMotCle | Where-Object {$_.name -match $NomFichCible}[/code:1] mais je n'y arrive pas également.

Si vous une idée pour m'aiguiller, je suis preneur !
Par avance, merci pour aide.

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

Plus d'informations
il y a 9 ans 5 mois #22532 par Laurent Dardenne
Salut,
si tu peux créer un objet à partir de ton fichier ce sera déjà plus simple(cf. Import-CSV).
Pour select-string c'est l'inverse, -Pattern contient les mot recherchés.
Ils peuvent être une alternative '(MotClé1|MotClé2|MotClé3' que l'on peut construire ainsi :
[code:1]
$ofs='|'
$TableauKeys=@('MotClé1','MotClé2','MotClé3')
$TableauKeys
$Pattern=\"$TableauKeys\"
$Pattern
[/code:1]
Ensuite il faut savoir si tes mot clés peuvent contenir des métacaractères des regex, si oui il faut les échapper ([regex]:Escape($Motclé) )<br><br>Message édité par: Laurent Dardenne, à: 22/10/16 14:45

Tutoriels PowerShell

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

Plus d'informations
il y a 9 ans 5 mois #22533 par Speed83
Bonjour Laurent,

Merci pour l'aide !

En effet avec Import-csv je commence à obtenir quelque chose.
Je continue de creuser à partir de ces infos.
Merci

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

Plus d'informations
il y a 9 ans 5 mois #22534 par Laurent Dardenne
une suite possible, brut de fonderie:
[code:1]
\&quot;$(
$T[0].psobject.Properties|
Where-Object {$_.name -like '*motcle*'}|
Foreach-Object {[regex]::Escape($_.value)}
)\&quot;
[/code:1]
Où $T est le résultat d'Import-csv.
On recherche les propriété dont le nom est motclé, on récupère sa valeur, on échappe son contenu, enfin on transforme le tableau en une alternative.

Tu peux aussi utiliser l'opérateur -F
[code:1]
'{0}|{1}|{2}' -F $T[0].Motcle1,$T[0].Motcle2,$T[0].Motcle3
[/code:1]

Tutoriels PowerShell

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

Plus d'informations
il y a 9 ans 5 mois #22535 par Speed83
Hoo merci, j'avoue que là comme ça je ne sais pas trop comment utiliser ce code :S.

Sinon j'ai commencé à avancer avec le import-csv :
[code:1] $csvImport = Import-Csv .\test.csv
ForEach ($item in $csvImport) {
$MT1 = $item.MT1
$MT2 = $item.MT2
$MT3 = $item.MT3
$MT4 = $item.MT4
$MT5 = $item.MT5
$DOSS = $item.DOSS
}
$ofs='|'
$TableauKeys=@($MT1,$MT2,$MT3,$MT4,$MT5)
#$TableauKeys
$Pattern=\&quot;$TableauKeys\&quot;
}
$test2 = Select-String $test3 -Pattern $Pattern
[/code:1]

$test3 est une variable pointant vers un fichier texte ou je récupère tous les noms des fichiers.

Je ne sais pas si mon code est très cohérent...

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

Plus d'informations
il y a 9 ans 5 mois #22536 par Laurent Dardenne
Speed83 écrit:

je ne sais pas trop comment utiliser ce code :S.

oui c'est pour cela que je t'ai indiqué une approche + simple :
[code:1]
'{0}|{1}|{2} etc' -F $item.MT1,$item.MT2,$item.MT3 etc
[/code:1]
'etc' est à compléter : {3} $item.MT4
Speed83 écrit:

Je ne sais pas si mon code est très cohérent...

Il te faut un jeux de test pour le savoir.
Déjà ta boucle Foreach sur les objets issus du csv doit contenir le traitement sinon ton alternative $Pattern=\&quot;$TableauKeys\&quot; ne contiendra que le dernier objet.

Le mieux est d'écrire le code d'un seul cas (un seul objet issu du csv) et de le compléter au fur et à mesure. Ainsi tu sauras ce qu'il te faut faire exactement.
Une fois qu'il fonctionne tu modifies ton code pour traiter tous les objets. Si tu crées une fonction pour traiter UN objet le code cela te sera plus facile à modifier :
import-csv
New-Alternative
Cherche
Traite le résultat

Tutoriels PowerShell

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

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