¿Puedo usar variables existentes en PowerShell read-host?
Estoy escribiendo un script simple en PowerShell usando "read-host -prompt" para poder ingresar algo de texto que luego se usará para crear algunas variables de entorno.
¿Hay alguna forma de que las siguientes veces que se ejecute el script, el mensaje de host de lectura muestre un valor existente para la variable, si existe? y si no es lo que quiero, ¿aceptar mi nueva entrada para cambiar esa variable?
por ejemplo ...
$myvar = read-host -prompt "whats your value" and i enter 10 to set $valor de myvar a 10
la próxima vez que se ejecute el script, "cuál es su valor" mostrará 10, y si presiono enter sin cambiar el valor, usará el valor 10 nuevamente. Si ingreso un nuevo valor, actualizará $ myvar al nuevo valor
Gracias por cualquier ayuda
Respuestas
No puedes hacer esto directamente:
####[int]$myVar = 10 Read too fast the question :) #$myVar = Get-ItemProperty ...
#or
#myVar = Get-Content ...
$tempVar = Read-Host "Enter the value ($myVar is default)"
if ($tempVar) { $myVar = $tempVar } $myVar
# Store $myVar in the registry or in the file for next run
Mi mal, respondí sin una buena lectura :) Como dijo @postanote, si necesita realizar un seguimiento del valor de cada ejecución, puede almacenarlo en un archivo (en mi humilde opinión, evitaría el profile.ps1) o en una clave de registro personal. Luego lea el archivo o el valor del registro para inicializar su variable.
Si comprendo correctamente, está buscando dos funciones que no están implementadas en Read-HostPowerShell 7.1:
(a) Rellenar previamente el búfer de edición con un valor predeterminado , que el usuario puede aceptar tal como está o modificar.
- La alternativa es simplemente informar al usuario, a través de la
-Promptcadena, qué valor se usará si no ingresa uno nuevo, pero de esa manera no podrá distinguir entre el usuario que elige el valor predeterminado o simplemente desea abortar el indicador (lo que podrían hacer Ctrl-C, sin embargo).
- La alternativa es simplemente informar al usuario, a través de la
(b) Mantener un historial persistente de valores ingresados por el usuario que recuerde (al menos) el valor ingresado más recientemente, en todas las sesiones de PowerShell .
Nota: Read-Hostactualmente es básico. El módulo que proporciona la rica experiencia interactiva de edición de línea de comandos para PowerShell en sí es PSReadLine, y sería excelente si sus características, que incluyen un historial persistente y la modificación del búfer de edición, pudieran estar disponibles para el código de usuario para solicitudes de propósito general ; consulte Propuesta de GitHub # 881 . Hacer surgir
tales mejoras a través deRead-Host es probablemente la mejor opción, o al menos la capacidad de rellenar previamente el búfer de edición podría implementarse allí: consulte la propuesta de GitHub n .
Consulte las implementaciones personalizadas limitadas de (a) y (b) a continuación.
(a) es en la actualidad sólo posiblemente a través de una solución , y sólo en Windows , tanto en ventanas de la consola regulares y Windows Terminal (lo hace no trabajo (lo suficientemente fiable) en el obsoleto PowerShell ISE Gracias, CFou . , y en el terminal integrado de Visual Código Studio solo funciona si coloca el foco en él haciendo clic inmediatamente después de iniciar una sesión de depuración):
# The (default) value to pre-fill the Read-Host buffer with.
$myVar = 'This is a default value.' # Workaround: Send the edit-buffer contents as *keystrokes* # !! This is not 100% reliable as characters may get dropped, so we send # !! multiple no-op keys first (ESC), which usually works. (New-Object -ComObject WScript.Shell).SendKeys( '{ESC}' * 10 + ($myVar -replace '[+%^(){}]', '{$&}') ) $myVar = Read-Host 'Enter a value' # Should display prompt with value of $myVar
Nota: La -replaceoperación es necesaria para escapar caracteres en el valor predeterminado que de otro modo tendrían un significado especial para .SendKeys().
(b) requiere que implemente su propio mecanismo de persistencia, y la opción obvia es usar un archivo :
Este es un enfoque simplista que solo almacena el valor más reciente ingresado.
- El soporte de múltiples valores históricos por pronta apoyaría también para el recuerdo en
Read-Host, por ejemplo como el uso de flecha hacia arriba y flecha hacia abajo para desplazarse a través de la historia, que se no se admite como de PowerShell 7.1.
# Choose a location for the history file.
$historyFile = "$HOME/.rhhistory" # Read the history file (which uses JSON), if it exists yet. $history = Get-Content -Raw -ErrorAction Ignore $historyFile | ConvertFrom-Json $defaultValue = 'This is a default value.'
# Get the 'myVar' entry, if it exists, otherwise create it and use the default value.
$myVar = if (-not $history) { # no file yet; create the object to serialize to JSON later
$history = [pscustomobject] @{ myVar = '' } $defaultValue
} elseif (-not $history.myVar) { # file exists, but has no 'myVar' entry; add it. $history | Add-Member -Force myVar ''
$defaultValue } else { # return the most recently entered value. $history.myVar
}
# Prompt the user.
(New-Object -ComObject WScript.Shell).SendKeys(
'{ESC}' * 10 + ($myVar -replace '[+%^(){}]', '{$&}')
)
$myVar = Read-Host 'Enter a value' # Validate the value... # Update the history file with the value just entered. $history.myVar = $myVar $history | ConvertTo-Json > $historyFile