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.