1 votes

Powershell dans un fichier batch - conserver la correspondance des caractères génériques lors du remplacement?

Je l'utilise dans le cadre d'une commande Powershell dans un fichier de commandes pour remplacer du texte dans un autre fichier :

-replace 'contrast=.*? -b:v', 'contrast=.*?,fps=%FRAMERATE% -b:v'

Le fichier modifié pourrait avoir une valeur de contraste spécifique comme ceci :

contrast=1.03

Si j'essaie d'utiliser un joker .*? comme indiqué ci-dessus, il ne conserve pas la valeur 1.03 pour le contraste, il la remplace simplement par les caractères de joker littéraux, je me retrouve donc avec contrast=.*? dans le fichier modifié.

La valeur du contraste pourrait changer. Y a-t-il un moyen de dire à Powershell, quelle que soit cette valeur dans la première partie de la commande de remplacement, elle doit rester la même dans la partie suivante ?

Quelqu'un a dit de le mettre entre crochets (et ceux-ci devraient être échappés puisqu'il s'agit d'un fichier de commandes) mais cela ne fonctionne pas, ceci :

-replace 'contrast=/[.*?/] -b:v', 'contrast=/[.*?/],fps=%FRAMERATE% -b:v'

Tout ce que cela fait, c'est me donne ceci dans le fichier modifié : contrast=/[.*?/]

Je suis sûr qu'il y a une combinaison étrange ou une manière de le faire, je ne sais juste pas comment le découvrir.

Merci d'avance à quiconque pourra éclairer ma lanterne.

0voto

Cpt.Whale Points 1486

Vous le pouvez! -replace prend en charge l'utilisation de groupes de capture et les définit automatiquement en tant que variable $1, $2, etc que vous pouvez utiliser :

# Exemple de texte d'entrée
$text = 'contrast=1.03 -b:v
contrast=2.34 -b:v
contrast=6.66 -b:v'

$text -replace '(.*?) -b:v', '$1,fps=%FRAMERATE% -b:v'

# Résultat :
contrast=1.03,fps=%FRAMERATE% -b:v
contrast=2.34,fps=%FRAMERATE% -b:v
contrast=6.66,fps=%FRAMERATE% -b:v

$1 n'est pas une variable powershell, donc le $ doit être littéral dans votre chaîne de remplacement. Si vous souhaitez utiliser des variables dans votre regex, assurez-vous de l'échapper :

$text -replace '(.*?) -b:v', "`$1,fps=$framerate -b:v"

Consultez la section "Remplacer en utilisant des groupes de capture" sur SS64 pour plus d'exemples.

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