Posso usare le variabili esistenti in PowerShell read-host
sto scrivendo un semplice script in PowerShell usando "read-host -prompt" in modo da poter inserire del testo che verrà poi utilizzato per creare alcune variabili d'ambiente.
C'è un modo in cui le volte successive in cui lo script viene eseguito, il messaggio dell'host di lettura mostrerà un valore esistente per la variabile se esiste? e se non quello che voglio allora accettare il mio nuovo input per cambiare quella variabile?
per esempio ...
$myvar = read-host -prompt "whats your value" and i enter 10 to set $valore myvar a 10
la prossima volta che lo script viene eseguito, "qual è il tuo valore" mostrerà 10, e se premo invio senza modificare il valore utilizzerà di nuovo il valore 10 .. se inserisco un nuovo valore aggiornerà $ myvar al nuovo valore
Grazie per qualsiasi aiuto
Risposte
Non puoi farlo direttamente:
####[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
Colpa mia, ho risposto senza una buona lettura :) Come ha detto @postanote, se hai bisogno di tenere traccia del valore di ogni corsa, puoi salvarlo in un file (IMHO, eviterei il profile.ps1) o in una chiave di registro personale. Quindi leggere il file o il valore del registro per inizializzare la variabile.
Se ho capito bene, stai cercando due funzionalità che non sono implementate in Read-HostPowerShell 7.1:
(a) Pre-riempimento del buffer di modifica con un valore predefinito , che l'utente può accettare così com'è o modificare.
- L'alternativa è solo quella di informare l'utente, tramite la
-Promptstringa, quale valore verrà utilizzato se non ne inserisce uno nuovo, ma in questo modo non sarà possibile distinguere tra l'utente scegliendo il valore di default o semplicemente volendolo abortire il prompt (cosa che potrebbero fare Ctrl-C, tuttavia).
- L'alternativa è solo quella di informare l'utente, tramite la
(b) Mantenere una cronologia persistente dei valori immessi dall'utente che ricorda (almeno) il valore immesso più di recente, nelle sessioni di PowerShell .
Nota: Read-Hostattualmente è scarno. Il modulo che fornisce la ricca esperienza di modifica interattiva della riga di comando per PowerShell stesso è PSReadLine, e sarebbe fantastico se le sue funzionalità, che includono una cronologia persistente e la modifica del buffer di modifica, potessero essere rese disponibili al codice utente per richieste generiche - vedere Proposta GitHub n . 881 .
Far emergere tali miglioramenti tramiteRead-Host è probabilmente l'opzione migliore, o almeno la possibilità di precompilare il buffer di modifica potrebbe essere implementata lì: vedere la proposta di GitHub # 14013 .
Vedi - limitate - implementazioni personalizzate di (a) e (b) di seguito.
(a) è attualmente solo possibilmente tramite una soluzione alternativa , e solo su Windows , sia nelle normali finestre della console che in Windows Terminal ( non funziona (abbastanza affidabile) nell'obsolescente PowerShell ISE Thanks, CFou . e nel terminale integrato di Visual Studio Code funziona solo se ci si concentra facendo clic immediatamente dopo aver avviato una sessione di debug):
# 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: l' -replaceoperazione è necessaria per eseguire l' escape dei caratteri nel valore predefinito che altrimenti avrebbero un significato speciale .SendKeys().
(b) richiede di implementare il proprio meccanismo di persistenza e la scelta ovvia è utilizzare un file :
Ecco un approccio semplicistico che memorizza solo il valore inserito più di recente .
- Il supporto di più valori cronologici per prompt supporterebbe anche il richiamo in
Read-Host, ad esempio l'utilizzo di freccia su e freccia giù per scorrere la cronologia, che non è supportato a partire da 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