web-dev-qa-db-ja.com

Read-Hostでデフォルト値を使用するためのワンライナーはありますか?

プロンプトのデフォルト値を指定するために、このようなものを書きました。

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

さらに短くできますか?

これが私の試みです。

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

ワンライナーが欲しいので、それまでは返事を差し控えます。

N.b. $defaultValueは、1つのライナーとは別に保管する必要があります。上記の例と同様です。

私が探していた解決策へと導く答えを受け入れました。

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

そして、なぜかと尋ねるあなたのために。その理由は、私の後に来る人の目に優しいからです。明快さを犠牲にしない場合、少ない方が常に多くなります。私見では。

編集;

単一の行の代わりに、おそらく私は単一のフレーズを言うべきでしたか?私が使用してきたいくつかの回答がセミコロンを使用している間に、この編集の明確化を追加しました。

16
bluekeys

私が思いついた最短バージョン:

if (!($value = Read-Host "Value [$default]")) { $value = $default }

このバージョンは他に使用する必要はありません。

3
Adam Nagy
$defaultValue = 'default'
$Prompt = Read-Host "Press enter to accept the default [$($defaultValue)]"
$Prompt = ($defaultValue,$Prompt)[[bool]$Prompt]

絶対に1行に収める必要がある場合:

$defaultValue = 'default'
($defaultValue,(Read-Host "Press enter to accept the default [$($defaultValue)]")) -match '\S' |% {$Prompt = $_}
22
mjolinor
if(($result = Read-Host "Press enter to accept default value [default]") -eq ''){"default"}else{$result}
11
ojk
$DefaultValue="Foobar"

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

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

これを一緒に投げて、以前に入力した構成値を再利用しながら、必要に応じてユーザーが変更できるようにします...受け入れられた回答には割り当て部分がなく、ハードコードされた「デフォルト」値を使用しています...

「三項演算子」または「二項演算子」( https://en.wikipedia.org/wiki/%3F: )と呼ばれる(他の言語からの)関数があります( 'xx:yy? zz 'スタイル1)、Powershellでその動作を実装するための関数を送信した人が何人かいます。

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

そのために関数を使用しています:

Function Read-HostDefault($Prompt, $Default) {
    if ($default) {
        $Prompt = "$Prompt [$default]"
    }
    $val = Read-Host $Prompt
    ($default,$val)[[bool]$val]
}

それは与える:

PS C:\Windows\system32> Read-HostDefault "Enter port" 5432
Enter port [5432] : 
5432

PS C:\Windows\system32> Read-HostDefault "Enter port" 5432
Enter port [5432] : 1234
1234

PS C:\Windows\system32> Read-HostDefault "Enter port"
Enter port : 2468
2468
1
Matthieu

与えられた答えは私を満足させません(そして私のために機能しません)が、最短のワンライナーを思いつくのに十分なインプットを与えてくれました。

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

なぜ他を追加するのですか?ユーザーが何も入力しない場合、$ Prompt = "your default"になります(もちろん変数にすることもできます)。彼が何かを追加した場合、それはすでに%Promptに格納されており、ステートメントを終了できます。

1
Daniel H

$ defaultValueがすでにあると仮定します。

$newValue = if ($value = Read-Host -Prompt "Please enter a value ($defaultValue)") { $value } else { $defaultValue }

これはうまくいくはずです

0
Fredi

次のように、switchステートメントを1行で使用することもできます。

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

-regex.+は1つ以上の文字に一致します。これには空白文字が含まれるため、スイッチ一致を実行するときに空白を削除したい場合があります。つまり、\S.+

0
stinkyfriend