Question
Regex et positionnement aléatoire de caractères
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Oui, bien que ce soit la méthode Escape et non pas Replace.c'est ça ?
On peut très bien coder directement la regex, pour moi l’intérêt est qu'on peut modifier le tableau de balises sans modifier le code.
Une fois qu'on connait cette technique on la réutilise sans se poser de question.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- rocketter
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 46
- Remerciements reçus 0
Par contre je ne comprends pas l'utilité de cette ligne :[code:1]$ofs=$oldOfs[/code:1] ?
et concernant sinon ta regex :
[code:1](?<=($Balises).*?)[/code:1]
Est ce que dans .*? ; le \"?\" n'est pas en trop ? Car finalement .* signifiant n'importe quel caractère présent 0 ou plusieurs fois. Le \"?\" n'est-il pas superflu ?
Sinon je te remercie du coup de main
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Je réaffecte la valeur initiale, c'est une habitude qui évite les surprises aux utilisateurs.Par contre je ne comprends pas l'utilité de cette ligne :[code:1]$ofs=$oldOfs[/code:1]
Si on utilise un script/fonction dans sa propre portée, ce n'est pas nécessaire, mais on ne sait jamais ce que fait l'utilisateur d'un code.
Je m'efforce de laisser le contexte dans l'état où je l'ai trouvé.
rocketter écrit:
Si, pour ce cas ce n'est pas nécessaire.Est ce que dans .*? ; le \"?\" n'est pas en trop ?
rocketter écrit:
Je suis surtout un adepte de ce qui me sertj'vois que t'es un adepte des méthodes statiques
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- rocketter
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 46
- Remerciements reçus 0
Connexion ou Créer un compte pour participer à la conversation.
- rocketter
- Auteur du sujet
- Hors Ligne
- Membre senior
-
- Messages : 46
- Remerciements reçus 0
Code simplifié :
[code:1]$BalisesRecherchees='|OP|','|IP|','|MP|','|PA|','|IO|'
$oldOfs,$ofs=$ofs,\";\"
$Balises=[regex]::Escape($BalisesRecherchees).Replace(';','|')
$ofs=$oldOfs
$T = @\"
\"qsmldkqpsdokjq|poqskjdpdjpqosjkd|poqskjpokqjd||MP|12345
A|65464654\"
\"@
$T| select-string \"(?<=($Balises).*?)(\n|\r|\r\n)A\|\" -quiet[/code:1]
Avec le paramètre quiet de select-string, le résultat est True, ce qui est exact.
Mais avec ce code :
[code:1]$BalisesRecherchees='|OP|','|IP|','|MP|','|PA|','|IO|'
$oldOfs,$ofs=$ofs,\";\"
$Balises=[regex]::Escape($BalisesRecherchees).Replace(';','|')
$ofs=$oldOfs
(get-childitem –Path \"c:\test.hpr\"«»)| select-string \"(?<=($Balises).*?)(\n|\r|\r\n)A\|\" -quiet[/code:1]
Mon booléen est à False, alors que le contenu de test.hpr est exactement le même que celui de la variable $T.
Je ne comprends pas du tout
Connexion ou Créer un compte pour participer à la conversation.
- xyz
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 69
Ton affirmation est ici erronée.alors que le contenu de test.hpr est exactement le même que celui de la variable $T.
Il faut connaitre le Parameter Binding (liaison de paramètre), un des principes de base de Powershell.
[code:1]
Trace-Command ParameterBinding {(get-childitem -Path \"c:\test.hpr\"«»)| select-string \"(?<=($Balises).*?)(\n|\
r|\r\n)A\|\" -quiet } -pshost
[/code:1]
Qui renvoi le détail de cette liaison:
La ligne qui nous intéresse :...
DÉBOGUER : ParameterBinding Information: 0 : CALLING BeginProcessing
DÉBOGUER : ParameterBinding Information: 0 : BIND PIPELINE object to parameters: [Select-String]
DÉBOGUER : ParameterBinding Information: 0 : PIPELINE object TYPE = [System.IO.FileInfo]
DÉBOGUER : ParameterBinding Information: 0 : RESTORING pipeline parameter's original values
DÉBOGUER : ParameterBinding Information: 0 : Parameter [InputObject] PIPELINE INPUT ValueFromPipeline NO COERCION
DÉBOGUER : ParameterBinding Information: 0 : BIND arg [C:\test.hpr] to parameter [InputObject]
DÉBOGUER : ParameterBinding Information: 0 : BIND arg [C:\test.hpr] to param [InputObject] SUCCESSFUL
DÉBOGUER : ParameterBinding Information: 0 : MANDATORY PARAMETER CHECK on cmdlet [Select-String]
Pour la comprendre il faut savoir lire l'aide en ligne :BIND arg [C:\test.hpr] to param [InputObject] SUCCESSFUL
[code:1]
help select-string -Parameter inputobject
#...
#Accepter l'entrée de pipeline ? true (ByValue)
#...
[/code:1]
PS récupère un objet fichier et le passe au paramètre $InputObject via le pipeline (PS le transforme en une String).
Tu lui passes le nom du fichier pas son contenu
Voir aussi ce bug et les autres
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Regex et positionnement aléatoire de caractères