variable print definir powershell variables

powershell - print - Expansión de variables en el contenido del archivo



powershell variable expansion (2)

Tengo un archivo template.txt que contiene lo siguiente:

Hello ${something}

Me gustaría crear un script de PowerShell que lea el archivo y expanda las variables en la plantilla, es decir,

$something = "World" $template = Get-Content template.txt # replace $something in template file with current value # of variable in script -> get Hello World

¿Cómo podría hacer esto?


Encontré esta solución:

$something = "World" $template = Get-Content template.txt $expanded = Invoke-Expression "`"$template`"" $expanded


Otra opción es usar ExpandString () por ejemplo:

$expanded = $ExecutionContext.InvokeCommand.ExpandString($template)

Invoke-Expression también funcionará. Sin embargo, ten cuidado Ambas opciones son capaces de ejecutar código arbitrario, por ejemplo:

# Contents of file template.txt "EvilString";$(remove-item -whatif c:/ -r -force -confirm:$false -ea 0) $template = gc template.txt iex $template # could result in a bad day

Si desea tener una evaluación de cadena "segura" sin la posibilidad de ejecutar código accidentalmente, entonces puede combinar trabajos de PowerShell y espacios de ejecución restringidos para hacer eso, por ejemplo:

PS> $InitSB = {$ExecutionContext.SessionState.Applications.Clear(); $ExecutionContext.SessionState.Scripts.Clear(); Get-Command | %{$_.Visibility = ''Private''}} PS> $SafeStringEvalSB = {param($str) $str} PS> $job = Start-Job -Init $InitSB -ScriptBlock $SafeStringEvalSB -ArgumentList ''$foo (Notepad.exe) bar'' PS> Wait-Job $job > $null PS> Receive-Job $job $foo (Notepad.exe) bar

Ahora bien, si intenta utilizar una expresión en la cadena que utiliza un cmdlet, esto no ejecutará el comando:

PS> $job = Start-Job -Init $InitSB -ScriptBlock $SafeStringEvalSB -ArgumentList ''$foo $(Start-Process Notepad.exe) bar'' PS> Wait-Job $job > $null PS> Receive-Job $job $foo $(Start-Process Notepad.exe) bar

Si desea ver una falla si se intenta un comando, entonces use $ ExecutionContext.InvokeCommand.ExpandString para expandir el parámetro $ str.