2014-10-15 15 views
8

Napisałem coś takiego, aby określić domyślne wartości podpowiedzi.Czy istnieje jednolinijka do używania wartości domyślnych z Read-Host?

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

Czy można go jeszcze bardziej skrócić?

Oto moja próba.

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

Chcę mieć jeden liniowiec, więc zamierzam zaakceptować odpowiedź do tego czasu.

N.b. $defaultValue należy przechowywać niezależnie od jednego wkładu. Podobne do powyższego przykładu.

Przyjąłem odpowiedź, która doprowadziła mnie do rozwiązania, którego szukałem.

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

A dla tych z Państwa, którzy pytają dlaczego. Powodem jest to, że jest łatwiej na oczach tego, kto przyjdzie po mnie. Mniej znaczy zawsze więcej, gdy jasność nie jest poświęcana. MOIM ZDANIEM.

EDYCJA;

Zamiast jednej linii, być może powinienem powiedzieć jedno zdanie? Dodałem tę edycję wyjaśnienia, podczas gdy kilka odpowiedzi, które widziałem, używają średnika.

+3

wbijanie jak największej ilości kodu w pojedynczą linię nigdy nie jest łatwiejsze dla oczu. MOIM ZDANIEM. –

+0

Zdefiniuj "idealny" według Ciebie? – bluekeys

Odpowiedz

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

Czy można to zrobić bez dwukrotnego wpisywania "domyślnego"? To znaczy. domyślnie można zapisać w zmiennej? – bluekeys

+0

To mi odpowiada: '$ defaultValue = 'default' if (($ result = Read-Host" Naciśnij enter, aby zaakceptować wartość domyślną $ defaultValue ") -eq '') {$ defaultValue} else {$ result}'. Dziękuję Ci. – bluekeys

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

Jeśli koniecznie mieć go w jednej linii:

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

To dobrze, chcę, aby ostatnie 2 linie w jednej linii, zanim przyjmuję odpowiedź. – bluekeys

+6

Dlaczego? Jaki jest możliwy powód, by wymagać jednej liniowej? Czy pochodzisz z tła perla? – EBGreen

+1

Co powiedział EBGreen. Ale FTR: zawsze możesz umieścić 2 instrukcje w jednej linii, oddzielając je średnikiem. –

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

Można także użyć instrukcji switch w jednej linii tak:

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

The -regex.+ dopasuje jeden lub więcej znaków, to będzie zawierać dowolne białe spacje, więc może chcesz usunąć białe spacje podczas wykonywania dopasowania przełącznika, tj. \S.+.

2
$DefaultValue="Foobar" 

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

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

Właśnie rzucił to razem, aby ponownie użyć wcześniej wprowadzoną wartość config jednocześnie umożliwiając użytkownikowi zmienić go w razie potrzeby ... Przyjęty odpowiedź brakuje część przydziału i używa na sztywno „Default” wartość ..

Istnieje funkcja (z innych języków) o nazwie "Ternary Operator" lub "Operator binarny" (https://en.wikipedia.org/wiki/%3F:) (styl "xx: yy? Zz") i jest kilka osób, które przesłały funkcje do wdrożenia jego zachowanie w Powershell.

Powiązane problemy