是否有一个单行使用读取主机的默认值?

时间:2014-10-15 15:25:28

标签: powershell refactoring

我写过这样的内容来指定提示的默认值。

$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应独立于一个班轮存放。与上面的例子类似。

我接受了答案,这些答案引导我找到我正在寻找的解决方案。

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

对于那些问你原因的人。原因是因为跟随我的人眼睛更容易。在不牺牲清晰度的情况下,总是更少。 IMHO。

EDIT;

也许我应该说一个短语而不是单行? 我添加了这个编辑澄清,而我看到的一些答案使用的是分号。

10 个答案:

答案 0 :(得分:20)

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

如果你必须把它放在一行:

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

答案 1 :(得分:12)

我想出的最短版本:

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

此版本无需使用其他版本。

答案 2 :(得分:11)

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

答案 3 :(得分:3)

$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'样式一)并且有几个人提交了函数来实现其在Powershell中的行为。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

您也可以在一行中使用switch语句,如下所示:

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

-regex .+将匹配一个或多个字符,这将包含任何空白字符,因此您可能希望在执行切换匹配时删除空格,即\S.+。< / p>

答案 6 :(得分:0)

给定的答案并不能满足我(并且对我不起作用)但给了我足够的投入以得出最短的单行。

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

为什么要添加其他内容?如果用户没有输入任何内容,则表示$ prompt =“您的默认值”(当然可能是变量)。如果他添加了某些内容,它已经存储在%提示符中,您可以保留该语句。

答案 7 :(得分:0)

假设您已经有$ defaultValue:

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

这应该有效

答案 8 :(得分:0)

我为此使用了一个函数

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

答案 9 :(得分:0)

对我来说这是最短的,最容易使用的,并且不会重复变量值或名称:

$ChosenValue = 'Default Value' | %{ If($Entry = Read-Host "Enter a value ($_)"){$Entry} Else {$_} }

神奇的地方是 |%{} 将默认值通过管道传递给 ForEach,允许在消息和返回值中重复默认值(别名为 $_)。它还取决于赋值运算符返回为 If 语句分配的值这一事实。提供条目时,此分配的值将被视为 $true,而当按下 $false 键时,将被视为 [Enter](空)。

感谢@ojk 的优秀答案,我认为它最容易使用和阅读,但我同意@bluekeys 的观点,即最好避免重复默认值和分配的变量名。事实证明,使用中间 $Entry 变量并不不方便。

我经常使用此方法来定义具有可在运行时覆盖的默认值的函数或脚本参数:

param(
    $hostname = ('google.com' | %{ If($Entry = Read-Host "Host name ($_)"){$Entry} Else {$_} }) 
)
Write-Host $hostname

运行:

Host name (google.com): 
google.com

Host name (google.com): facebook.com
facebook.com

此外,正如@E.Sundin 指出的那样,Powershell 7 终于有了一个三元运算符,使这种语法更加简单。不幸的是,我们中的许多人都在使用在不久的将来不会获得第 7 版的遗留系统。