2010-01-06 99 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

這是我的第一個PowerShell腳本,所以請隨時指出我可能犯的錯誤。 – 2010-01-06 17:23:11

回答

10

是的,你可以檢查一個字符串包含日期用「(-as [DATETIME])」。我的原始腳本中的問題是我假設腳本輸入參數是字符串。顯然,數字參數會自動轉換爲整數,除非用引號鍵入。所以,我應該寫下

if ([string]$date -as [DateTime]) 

強迫將可能的數字轉換回字符串,正如Keith在他的回答中所做的那樣。

同樣的缺陷適用於我的整數檢查。給定「10月3日」(不含引號)時,腳本失敗。 PS在這裏創建一個數組嗎?

檢查成功時,爲什麼解析失敗?約翰尼斯解釋說。表達式

$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都有一個Ticks屬性,自0001-01-01以來它們的間隔爲100 ns。您可以使用這些刻度初始化DateTime,儘管到目前爲止我還沒有找到它的用處。

PS> ([datetime]1234).Ticks 
1234 

但這就是爲什麼你可以投一個號碼到DateTime它的工作原理。這可能只是一個很早的日期:-)

所以基本上,你現在在做什麼,我。即首先檢查號碼是否正確,因爲DateTime不能幫助您確定是日期還是數字。

+0

我更喜歡這種方法來使用[DateTime] :: Parse方法,因爲這種方法有一個非常漂亮的副作用。由於PowerShell會一直嘗試將所需的參數強制轉換爲所需的類型,因此可以使用任何本地化日期時間格式的簡單字符串調用此函數: 即Foo「1:OO PM」,Foo「1/1/2012 20:12「 希望這會有所幫助 – 2010-01-06 21:13:53

+0

我不關注。對於DateTime解析也是如此,它在解析字符串時使用當前線程的文化。最終,我會冒昧於PowerShell轉換在DateTime.Parse或DateTime.TryParse。我看不出他們爲什麼要重新實現該代碼。 – 2010-01-06 23:11:03

8

可以讓.NET框架幫助您完成此:

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'。 – 2011-02-26 22:42:21

相關問題