web-dev-qa-db-fra.com

Existe-t-il une solution unique pour utiliser les valeurs par défaut avec Read-Host?

J'ai écrit quelque chose comme ceci pour spécifier les valeurs par défaut des invites.

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

Peut-il être raccourci davantage?

Voici ma tentative.

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

Je veux une ligne, alors je vais accepter une réponse d'ici là.

N.b. $defaultValue doit être stocké indépendamment de la doublure. Similaire à l'exemple ci-dessus.

J'ai accepté la réponse qui m'a amené à la solution que je cherchais.

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

Et pour ceux d'entre vous qui demandent pourquoi. La raison est parce que c'est plus facile pour ceux qui veulent me suivre. Moins, c'est toujours plus, quand la clarté n'est pas sacrifiée. A MON HUMBLE AVIS.

MODIFIER;

Au lieu d’une seule ligne, j’aurais peut-être dû dire une seule phrase?.

11
bluekeys
if(($result = Read-Host "Press enter to accept default value [default]") -eq ''){"default"}else{$result}
11
ojk
$defaultValue = 'default'
$Prompt = Read-Host "Press enter to accept the default [$($defaultValue)]"
$Prompt = ($defaultValue,$Prompt)[[bool]$Prompt]

Si vous devez absolument l'avoir sur une seule ligne:

$defaultValue = 'default'
($defaultValue,(Read-Host "Press enter to accept the default [$($defaultValue)]")) -match '\S' |% {$Prompt = $_}
18
mjolinor
$DefaultValue="Foobar"

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

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

Nous avons simplement jeté cela ensemble pour réutiliser une valeur de configuration saisie précédemment tout en permettant à l'utilisateur de la modifier si nécessaire ... La réponse acceptée manque la partie affectation et utilise une valeur "Défaut" codée en dur ...

Il existe une fonction (à partir d'autres langues) appelée "Opérateur ternaire" ou "Opérateur binaire" ( https://en.wikipedia.org/wiki/%3F: ) (style 'xx: yy? Zz' un) et plusieurs personnes ont soumis des fonctions pour mettre en œuvre son comportement dans Powershell.

2
bdp
$Prompt = ( ($defaultValue='a_default_value'), (Read-Host "Please enter something [$defaultValue]")) -match '\S' | select -last 1
1
Pedro Silva

Vous pouvez également utiliser une instruction switch sur une seule ligne, comme ceci:

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

Le -regex.+ correspondra à un ou plusieurs caractères, ce qui inclurait tous les caractères d’espace blanc. Par conséquent, vous voudrez peut-être supprimer l’espace blanc lorsque vous faites correspondre le commutateur, c.-à-d. \S.+.

0
stinkyfriend

Les réponses données ne me satisfont pas (et ne fonctionnent pas pour moi), mais m'ont suffisamment contribué à proposer le one-line le plus court.

if (($Prompt = Read-Host -Prompt "Your Text [your default]") -eq "") {$Prompt= "your default"} 

Pourquoi ajouter un autre? Si l'utilisateur n'entre rien, $ Prompt = "votre valeur par défaut" (peut être une variable bien sûr). S'il ajoute quelque chose, il est déjà stocké dans% Prompt et vous pouvez laisser l'instruction.

0
Daniel H