1
votes

Mettre à jour des variables dans des variables dans Powershell

Je ne connais pas grand-chose à Powershell mais j'essaie d'apprendre. Pouvez-vous m'aider à comprendre et à résoudre ce que je veux faire:

$string1=""

$complicatedString1 = "This is a complicated $string1"
$complicatedString2 = "$complicatedString1 too"

$string1 = "Test"

$complicatedString1 -> Should state now: This is a complicated Test
$complicatedString2 -> Should state now: This is a complicated Test too.

$string1 = "question"

$complicatedString1 -> Should state now: This is a complicated question
$complicatedString2 -> Should state now: This is a complicated question too.

and so on.

L'idée semble simple: je veux définir des chaînes qui servent de modèles, mais avec un contenu variable. Dans ce cas, je veux manipuler $ string1 et mettre à jour $ compliquéstring 1 et 2 afin que tout changement de $ string1 soit reflété dans ces chaînes.

$ string1 changerait fréquemment et pour le moment je n'ai aucune approche récupérez les valeurs modifiées dans ces chaînes. En gros, ce ne sont que des espaces réservés à attendre d'être modifiés.


3 commentaires

Votre description est encore un peu vague. Le contenu d'une variable est défini au moment où vous l'affectez. Si $ String1 est toujours vide et que vous définissez une autre variable comprenant $ String1 , elle restera vide. Vous devrez réassigner la nouvelle variable APRÈS avoir attribué quelque chose à $ String1 pour refléter ce changement dans la nouvelle variable. Vous pourriez montrer ou expliquer un peu plus votre cas d'utilisation.


Est-ce que cela répond à votre question? Comment développer une variable dans PowerShell?


Mettez vos compliquéString1 et compliquéString2 entre guillemets simples et utilisez ensuite: $ ExecutionContext.InvokeCommand.ExpandString ($ compliquéString1)


3 Réponses :


1
votes

Je ne suis pas tout à fait sûr, mais je pense que votre question porte sur l'utilisation de chaînes de modèle que vous pouvez modifier en utilisant de nouvelles chaînes à insérer.

La façon la plus élégante de le faire, je pense, est d'utiliser le PowerShell Opérateur de format -f comme celui-ci:

$string1 = [string]::Format($complicatedString1, "Test")
$string2 = [string]::Format($complicatedString2, $string1)

Vous pouvez également utiliser la méthode Format de la chaîne object lui-même si vous aimez:

# the template strings
$complicatedString1 = "This is a complicated {0}"
$complicatedString2 = "{0} too"

# use the template strings to return new strings
$string1 = $complicatedString1 -f "Test"                # --> "This is a complicated Test"
$string2 = $complicatedString2 -f $string1              # --> "This is a complicated Test too"

$string1 = $complicatedString1 -f "question"            # --> "This is a complicated question"
$string2 = $complicatedString2 -f $string1              # --> "This is a complicated question too"

qui vous donnera exactement les mêmes résultats


1 commentaires

Excellente réponse qui m'a aidé à résoudre mon problème de manière satisfaisante.



0
votes

Pour cela, vous devez mettre entre guillemets compliquéString1 et compliquéString2 (sinon ils seront directement développés), que vous pourriez utiliser $ ExecutionContext. Méthode InvokeCommand.ExpandString :

Function Expand([String]$String, [Int]$Depth = 1) {
    $Expand = $ExecutionContext.InvokeCommand.ExpandString($String)
    If ($Depth-- -ge 0) {Expand $Expand $Depth} Else {$Expand}
}

$string1 = 'Test'

Expand $complicatedString1
This is a complicated Test
Expand $complicatedString2 -Depth 2
This is a complicated Test too

Notez que vous devrez utiliser la méthode ExpandString deux fois sur $ compliquéString2 code> pour aller au bas de l'extension $ string1 .

Pour avoir une meilleure vue d'ensemble, vous pouvez envisager de créer une fonction récursive avec un -Paramètre de profondeur :

$complicatedString1 = 'This is a complicated $string1'
$complicatedString2 = '$complicatedString1 too'

$string1 = 'Test'

$ExecutionContext.InvokeCommand.ExpandString($complicatedString1)
This is a complicated Test
$ExecutionContext.InvokeCommand.ExpandString($ExecutionContext.InvokeCommand.ExpandString($complicatedString2))
This is a complicated Test too

$string1 = "question"

$ExecutionContext.InvokeCommand.ExpandString($complicatedString1)
This is a complicated question
$ExecutionContext.InvokeCommand.ExpandString($ExecutionContext.InvokeCommand.ExpandString($complicatedString2))
This is a complicated question too


1 commentaires

Aussi une excellente réponse avec des informations très utiles. L'autre réponse était un peu plus utile dans mon cas, car elle montre un moyen d'avoir un contrôle exact sur ce qu'il faut remplacer.



0
votes

Vous pouvez également le faire via une boucle

Please enter a word: Test
This is a complicated Test
This is a complicated Test too

Please enter a word: Question
This is a complicated Question
This is a complicated Question too

Please enter a word: Exit Program
This is a complicated Exit Program
This is a complicated Exit Program too
#Program Exits#

Sortie

do {
    $string1 = Read-Host "Please enter a word"
    $complicatedString1 = "This is a complicated $string1"; $complicatedString1
    $complicatedString2 = "$complicatedString1 too`n"; $complicatedString2
} while ($string1 -ne "exit program")


1 commentaires

Les réponses au code uniquement ne sont pas encouragées ici, pouvez-vous expliquer le contexte en quoi cette réponse vous aidera.