2010-01-06 8 views
7

내 스크립트의 입력 매개 변수는 날짜 또는 숫자입니다. 여기에 잘 작동하는 스크립트, 그래서 당신은 내가 뭘하려고 오전 볼 수 있습니다문자열에 날짜가 포함되어 있는지 어떻게 확인합니까?

param($date = (Get-Date)) 

if ($date -match "^\d+$") 
{ 
    $date = (Get-Date).AddDays($date) 
} 
elseif ($date -as [DateTime]) 
{ 
    $date = [DateTime]::Parse($date) 
} 
else 
{ 
    'You entered an invalid date' 
    exit 1 
} 

을 여기 내 이전의 시도가 하지 작업을 수행하는 것이있다 :

param($date = (Get-Date)) 

if ($date -as [DateTime]) 
{ 
    $date = [DateTime]::Parse($date) 
} 
elseif ($date -match "^\d+$") 
{ 
    $date = (Get-Date).AddDays($date) 
} 
else 
{ 
    'You entered an invalid date' 
    exit 1 
} 

언제 입력 할 수,를 스크립트가 날짜 분석 라인에서 중단됩니다. 내 "is is date"검사는 숫자가 주어지면 true를 반환합니다.

버그입니까? 그것은 설계에 의한 것인가?

+0

내 첫 번째 파워 쉘 스크립트이므로 가능한 실수를 지적하십시오. –

답변

10

예, 당신은 문자열 '(-as [날짜 시간]을)'를 사용하여 날짜를 포함 확인할 수 있습니다. 원래 스크립트의 문제점은 스크립트 입력 매개 변수가 문자열이라고 가정했기 때문입니다. 분명히, 숫자 매개 변수는 따옴표로 입력하지 않는 한 자동으로 정수로 변환됩니다. 그래서, 필자는 대답을 Keith가 대답 한 것처럼 쓸 수 있도록 숫자를 다시 문자열로 변환해야만합니다.

동일한 결함이 내 정수 검사에 적용됩니다. "Oct, 3"(따옴표 제외)가 주어지면 스크립트가 실패합니다. 추신 : 여기에 배열이 만들어 집니까?

왜 검사가 실패하면 구문 분석에 실패합니까? 요하네스는 그것을 설명했다. 표현

$date -as [DateTime] 

은 입력을 날짜로 변환하도록 PS에 지시합니다. 숫자를 변환하는 것은 의미가 있습니다 (날짜 1은 0001 년 1 월 1 일이므로) 숫자가 주어지면 실패하지 않습니다. 식

[DateTime]::Parse($date) 

은 특히 문자열을 구문 분석하므로 정수를 지정하는 것이 의미가 없으므로 오류가 발생합니다.

어쨌든 나는 둘 다 사용하는 것이 낭비였습니다. 첫째, 결과를 버리기 위해 조건으로 날짜로 변환합니다. 그런 다음 다른 구문으로 결과를 다시 만듭니다.변경 대상을

$date = $date -as [DateTime]; 
if (!$date) 
{ 
    'You entered an invalid date' 
    exit 1 
} 

감사합니다.

6

글쎄, DateTime이 막 뒤에서 숫자이기 때문에 모든 정수를 DateTime으로 전송할 수 있습니다.

마다 DateTime은 0001-01-01부터 100ns 간격 인 Ticks 속성을가집니다. 지금까지 사용법을 찾지 못했지만 그 진드기로 DateTime을 초기화 할 수 있습니다. 당신이 DateTime에 번호를 캐스팅 할 수 있으며 작동 왜

PS> ([datetime]1234).Ticks 
1234 

는하지만입니다. 아마도 날짜가 아주 먼 데이트 일 것입니다 :-)

근본적으로, 지금하고있는 일, 나. 이자형. 숫자를 먼저 확인하는 것은 DateTime에 대한 캐스트가 날짜인지 숫자인지를 결정하는 데 도움이되지 않기 때문에 적절한 방법입니다.

+0

이 방법은 매우 멋진 부작용이 있기 때문에 [DateTime] :: Parse 메서드를 사용하는 것이 좋습니다. PowerShell은 매개 변수에 필요한 유형이 필요한 유형으로 항상 캐스팅하려고하기 때문에 지역화 된 모든 날짜/시간 형식의 간단한 문자열로이 함수를 호출 할 수 있습니다. 즉 Foo "1 : OO PM", Foo "1/1/2012 20:12 " 희망이 도움이 –

+0

나는 따라하지 않습니다. DateTime 구문 분석과 동일한 방식으로 문자열을 구문 분석 할 때 현재 스레드의 culture를 사용합니다. 궁극적으로 필자는 PowerShell 변환이 DateTime.Parse 또는 DateTime.TryParse에 적용될 것을 예상합니다. 나는 그들이 그 코드를 다시 구현하기를 원할 이유가 없다고 본다. –

8

당신는 .NET Framework 도움을 당신이 함께 할 수

function ParseDate([string]$date) 
{ 
    $result = 0 
    if (!([DateTime]::TryParse($date, [ref]$result))) 
    { 
     throw "You entered an invalid date: $date" 
    } 

    $result 
} 

ParseDate 'June 51, 2001' 
+0

또는 PowerShell이 ​​무거운 짐을 덜어 주도록 할 수 있습니다. '[DateTime] $ date'을 사용하여 매개 변수의 형식을'DateTime '으로 지정해야합니다. –

관련 문제