programing

Read-Host와 함께 기본값을 사용할 수 있는 단일 라이너가 있습니까?

powerit 2023. 8. 16. 22:40
반응형

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하나의 라이너와 독립적으로 보관해야 합니다.위의 예와 유사합니다.

저는 제가 찾던 해결책으로 이어지는 답을 받아들였습니다.

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

그리고 이유를 묻는 분들도.그 이유는 누가 나를 쫓아와도 쉽게 볼 수 있기 때문입니다.명확성이 희생되지 않을 때, 적은 것이 항상 더 많습니다.임호.

편집;

한 줄이 아니라 한 구절만 말했어야 했나요?제가 본 몇 가지 답변이 세미콜론을 사용하는 동안 이 편집을 명확하게 추가했습니다.

$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 = $_}

제가 생각해낼 수 있는 최단 버전:

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

이 버전은 다른 버전을 사용할 필요가 없습니다.

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

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

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

이전에 입력한 구성 값을 다시 사용하기 위해 이 값을 함께 던졌지만 필요한 경우 사용자가 변경할 수 있습니다.승인된 응답에 할당 부분이 없으며 하드 코딩된 "기본값" 값을 사용합니다...

"3차 연산자" 또는 "2차 연산자"(https://en.wikipedia.org/wiki/%3F:) ('xx:yy?zz' 스타일 1)라는 함수가 있으며, 파워셸에서 동작을 구현하기 위해 함수를 제출한 사람이 여러 명 있습니다.

나에게 이것은 가장 짧고 사용하기 쉬우며 변수 값이나 이름을 반복하지 않습니다.

$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이 마침내 이 구문을 훨씬 더 단순하게 만드는 3원 연산자를 갖게 되었다고 지적했습니다.안타깝게도 우리 중 많은 사람들이 가까운 미래에 버전 7을 제공하지 못할 레거시 시스템을 연구하고 있습니다.

EDIT:이 없는 .: 중간자없약는짧있버습다니전이은간가여기▁edit.$Entry변수:

$hostname = 'google.com' | %{(Read-Host "Host name ($_)"),$_} | ?{$_} | Select -First 1 

은 다을포는배만듭다니열을함하음을 포함하는 .Read-Host응답 및 기본값을 필터링하여 빈 값을 제외하고 첫 번째 값(사용자가 응답한 경우 두 개)을 선택합니다.

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

주어진 답변은 저를 만족시키지 못했지만(그리고 저를 위해 일하지도 않습니다), 가장 짧은 한 줄기를 생각해내기에 충분한 의견을 주었습니다.

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

왜 다른 것을 추가합니까?사용자가 아무것도 입력하지 않으면 $sk="기본값"(물론 변수일 수 있음)이 수행됩니다.그가 무언가를 추가하면, 그것은 이미 %prompt에 저장되어 있고 당신은 문을 떠날 수 있습니다.

다음과 같은 기능을 사용하고 있습니다.

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

다음과 같은 한 줄로 스위치 문을 사용할 수도 있습니다.

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

-regex .+하나 이상의 문자와 일치합니다. 여기에는 공백 문자가 포함되므로 스위치 일치를 수행할 때 공백을 제거할 수 있습니다.\S.+.

$defaultValue가 이미 있다고 가정합니다.

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

이것은 효과가 있을 것입니다.

3개의 교환원이 계속해서 나에게 오류를 주었습니다.다른 답변에 따르면 이것이 제가 찾은 최선의 방법입니다 - 가정할 때$value되어 있습니다.

$value = if ($_ = Read-Host "Value - $value") {$_} else {$value}

이 기능을 다음과 같이 설정할 수 있습니다.

Function Input($prompt, $default) {
    $input = Read-Host "$prompt [$default]"
    $input = if ($input -eq [string]::empty) {$default} else {$input}
    Write-Host -ForegroundColor Yellow "> $input `n"
    return $input
}

$value = & Input "Confirm value" $value

& 연산자하기 전에Input이 기능을 통해 콘솔에 결과를 기록할 수 있습니다.

언급URL : https://stackoverflow.com/questions/26386267/is-there-a-one-liner-for-using-default-values-with-read-host

반응형