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 Réponses :
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
Excellente réponse qui m'a aidé à résoudre mon problème de manière satisfaisante.
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
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.
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")
Les réponses au code uniquement ne sont pas encouragées ici, pouvez-vous expliquer le contexte en quoi cette réponse vous aidera.
Votre description est encore un peu vague. Le contenu d'une variable est défini au moment où vous l'affectez. Si
$ String1est 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 à$ String1pour 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éString1etcompliquéString2entre guillemets simples et utilisez ensuite:$ ExecutionContext.InvokeCommand.ExpandString ($ compliquéString1)