web-dev-qa-db-fra.com

Séparez une chaîne avec PowerShell pour obtenir le premier et le dernier élément

Si vous le faites: git describe --long

vous obtenez: 0.3.1-15-g3b885c5

C'est la signification de la chaîne ci-dessus:

Tag-CommitDistance-CommitId ( http://git-scm.com/docs/git-describe )

Comment diviseriez-vous la chaîne pour obtenir le premier (Tag) et le dernier (CommitId) élément?

9
Elisabeth

En utilisant String.split() avec le paramètre count pour gérer les tirets dans le commitid:

$x = "0.3.1-15-g3b885c5"
$tag = $x.split("-",3)[0]
$commitid = $x.split("-",3)[-1]
15
Ocaso Protal

Remarque : Cette réponse se concentre sur l'amélioration de la division en jetons par - - approche de réponse utile d'Ocaso Protal .
Cependant, cette approche n'est pas entièrement robuste , car les noms de balises git peuvent eux-mêmes contenir -, vous ne pouvez donc pas supposer aveuglément que la première instance de - termine le nom complet de la balise.
Pour tenir compte de cela, utilisez plutôt la solution robuste de Richard


Juste pour offrir une variante plus idiomatique PowerShell:

$tag, $commitId = ('0.3.1-15-g3b885c5' -split '-')[0, -1]
  • -split opérateur de PowerShell est utilisé pour diviser la chaîne d'entrée en un tableau de jetons par séparateur -
    Bien que la fonction .Split() méthode du type [string] Soit suffisante ici, -split Offre de nombreux avantages dans général .

  • [0, -1] Extrait le premier (0) Et le dernier (-1) Élément du tableau renvoyé par -split Et les renvoie sous la forme d'un tableau à 2 éléments.

  • $tag, $commitId = Est une affectation de déstructuration qui affecte les éléments du tableau à 2 éléments résultant à une variable chacun.

4
mklement0

Je ne me souviens pas si les tirets sont autorisés dans les balises, donc je suppose qu'ils le sont, mais n'apparaîtront pas dans les deux derniers champs.

Donc:

if ("0.3.1-15-g3b885c5" -match '(.*)-\d+-([^-]+)') {
  $tag = $Matches[1];
  $commitId = $Matches[2]
}
2
Richard