2017-09-13 7 views
1

J'essaie d'écrire un script qui génère de nouveaux GUID lors de la recherche d'une correspondance. Mon problème est que je continue d'obtenir le même GUID généré pour tous les matches. Comment faire ceci sans générer le même GUID pour toutes les correspondances?Comment générer des règles uniques pour chaque correspondance

$testString = @" 
    [assembly: Guid Should Replace] 
    [assembly: Guid Should Replace]  
    [assembly: Guid Should Replace] 
"@ 
    #expected output 
    #[assembly: "unique guid"] 


    function ReplaceWithNewGuid { 
     param($content) 
     $retval = ($content -ireplace '(?m)(\[assembly: Guid.*$)+', "[assembly: Guid(`"$([guid]::NewGuid())`"]`)") 
     return $retval 
    } 

    ReplaceWithNewGuid($testString) 

Exemple de sortie réelle:

[assembly: Guid ("29e784aa-ba4a-4a45-85b8-d6b52916b539"])

[assembly: Guid ("29e784aa-ba4a-4a45- 85b8-d6b52916b539 "])

[assembly: Guid (" 29e784aa-ba4a-4a45-85b8-d6b52916b539" ])

Update

La réponse de @Mathias R. Jessen m'a aidé à obtenir ce dont j'avais besoin. Je pensais que je pourrais le faire dans PowerShell sans utiliser les bibliothèques de framework. Net mais, cela fonctionne comme prévu.

function ReplaceWithNewGuid { 
    param($content) 
    $retval = [regex]::Replace($testString, '(?m)(\[assembly: Guid.*$)+', {param($m) return "[assembly: Guid(`""+ (New-Guid).Guid + "`")]"}, 'IgnoreCase') 
    return $retval 
} 
+0

[guid] :: NewGuid() devrait toujours générer une valeur unique ... c'est le script complet? –

+2

L'interpolation de chaîne se produit avant l'exécution de votre commande. Vous générez donc le GUID à remplacer par une fois, puis tous les remplacements ont lieu. Je pense que le fait que chaque valeur soit unique va être beaucoup plus complexe. – BenH

+1

Désolé, mais quel '[assembly: Guid ...]' devrait être remplacé? –

Répondre

5

Vous pouvez utiliser Regex.Replace() directement, vous permet de passer un scriptblock en place du paramètre délégué MatchEvaluator:

$testString = @" 
[assembly: Guid Should Replace] 
[assembly: Guid Should Replace]  
[assembly: Guid Should Replace] 
"@ 

[regex]::Replace($testString, 'Guid Should Replace', {param($m) return (New-Guid).Guid}, 'IgnoreCase') 

Vous devriez voir qu'il retourne 3 identificateurs distincts

+0

Oui, le seul problème était avec l'expression rationnelle pour l'entrée d'origine. Après l'édition, il est maintenant un dupe de https://stackoverflow.com/questions/8163061/passing-a-function-to-powershells-replace-function –

+0

@ WiktorStribiżew J'ai essayé ceci avec mon expression rationnelle existante et cela fonctionne comme prévu . Ce n'est pas la regex mais c'est la meilleure réponse. – Terrance

+0

@Terrance Oui, c'est, tout le problème pour vous était de savoir comment utiliser un rappel dans Regex.Replace. –

-1
(New-Guid).Guid 

Presto, Guid s sur demande.

Et votre fonction réparé:

function ReplaceWithNewGuid 
{ 
    param($content) 

    $retval = ForEach ($Line in ($content -split "`n")) 
    { 
     $Line -replace 'guid.*$',"Guid(`"$((New-Guid).Guid)`"]" 
    } 
    Return $retval 
} 
+0

'[Guid] :: NewGuid(). Guid'. La version 3 n'est pas requise. –

+0

@Bill_Stewart Je dois avoir une version mise à jour. Il montre 3.1 pour moi. Je vais supprimer cela de la publication – TheIncorrigible1

+4

Le problème n'est pas la génération de GUID. Le problème est que seul un est généré pour toute l'opération de remplacement, pas un pour chaque remplacement. – BenH