2014-10-15 11 views
8

Ho scritto qualcosa come questo per specificare i valori predefiniti per i prompt.C'è un one-liner per usare i valori di default con Read-Host?

$defaultValue = 'default' 
$prompt = Read-Host "Press enter to accept the default [$($defaultValue)]" 
if ($prompt -eq "") {} else { 
    $defaultValue = $prompt 
    } 

Può essere abbreviato ulteriormente?

Ecco il mio tentativo.

$defaultValue = 'default' 
$prompt = Read-Host "Press enter to accept the default [$($defaultValue)]" 
if (!$prompt -eq "") {$defaultValue = $prompt} 

Voglio un one-liner, quindi ho intenzione di resistere accettando una risposta fino ad allora.

N.b. $defaultValue deve essere memorizzato indipendentemente da un solo rivestimento. Simile all'esempio sopra.

Ho accettato la risposta che mi ha portato alla soluzione che stavo cercando.

$defaultValue = 'default' 
if (($result = Read-Host "Press enter to accept default value $defaultValue") -eq '') {$defaultValue} else {$result} 

E per quelli di cui si chiede il perché. Il motivo è perché è più facile agli occhi di chi viene dopo di me. Meno è sempre di più, quando la chiarezza non viene sacrificata. A PARER MIO.

MODIFICA;

Invece di una singola riga, forse avrei dovuto pronunciare una singola frase? Ho aggiunto questa modifica chiarire mentre alcune risposte che ho visto utilizzare stanno usando un punto e virgola.

+3

inserire più codice possibile in una singola riga non è mai più facile per gli occhi. A PARER MIO. –

+0

Per favore definisci "ideale" secondo te? – bluekeys

risposta

10
if(($result = Read-Host "Press enter to accept default value [default]") -eq ''){"default"}else{$result} 
+0

Questo può essere fatto senza digitare "default" due volte? Cioè il valore predefinito può essere memorizzato in una variabile? – bluekeys

+0

Questo mi fa comodo: '$ defaultValue = 'default' if (($ result = Read-Host" Premi enter per accettare il valore predefinito $ defaultValue ") -eq '') {$ defaultValue} else {$ result}'. Grazie. – bluekeys

14
$defaultValue = 'default' 
$prompt = Read-Host "Press enter to accept the default [$($defaultValue)]" 
$prompt = ($defaultValue,$prompt)[[bool]$prompt] 

Se è assolutamente necessario disporre di essa in una sola riga:

$defaultValue = 'default' 
($defaultValue,(Read-Host "Press enter to accept the default [$($defaultValue)]")) -match '\S' |% {$prompt = $_} 
+0

Questo è buono, voglio le ultime 2 linee in una sola riga prima di accettare una risposta. – bluekeys

+6

Perché? Quale possibile motivo c'è per richiedere un solo rivestimento? Vieni da uno sfondo perl? – EBGreen

+1

Cosa diceva EBGreen. Ma FTR: puoi sempre mettere 2 affermazioni su una riga separandole con un punto e virgola. –

1
$prompt = (($defaultValue='a_default_value'), (Read-Host "Please enter something [$defaultValue]")) -match '\S' | select -last 1 
0

Si potrebbe anche usare uno switch in una sola riga come questa:

param([string]$myVariable = $($($val = $(Read-Host "Enter value")); $(Switch -regex ($val) { ".+" { $val } default { "my default value" } }))) 

-regex.+ corrisponderà a uno o più caratteri, questo includerebbe qualsiasi carattere di spazio bianco, quindi forse vuoi eliminare lo spazio bianco quando fai lo scambio di interruttori, ad esempio \S.+.

2
$DefaultValue="Foobar" 

.... (Optional other code) .... 

$Value=if($Value=(Read-Host "Enter value [$DefaultValue]")){$Value}else{$DefaultValue} 

appena buttato questo insieme di ri-utilizzare un valore di configurazione precedentemente inserito, pur consentendo all'utente di modificare, se necessario ... La risposta accettata manca la parte assegnazione e utilizza un valore hardcoded "Default" ..

Esiste una funzione (da altre lingue) denominata "Operatore ternario" o "Operatore binario" (https://en.wikipedia.org/wiki/%3F:) (lo stile 'xx: yy? Zz') e ci sono diverse persone che hanno inviato funzioni da implementare il suo comportamento in Powershell.

Problemi correlati