2012-09-19 6 views
2

이름과 날짜 (타사 응용 프로그램 (이 경우 svn)에서 검색되는 두 개의 열이있는 정보 테이블을 생성하는 PowerShell 스크립트를 작성하려고합니다. exe).PowerShell에서 DateTime 구문 분석

전체 스크립트가 제대로 작동하지만 서버가 DataTable에 다시 보내는 날짜를 얻으려고 애 쓰고 있습니다. 여기 내 스크립트의 단순화 된 버전입니다 :

# Set up a DataTable and initialise columns 
$table = New-Object system.Data.DataTable “Test Table” 
$col1 = New-Object system.Data.DataColumn Name,([string]) 
$col2 = New-Object system.Data.DataColumn DateFromServer,([DateTime]) 
$table.columns.add($col1) 
$table.columns.add($col2) 

# Create a new row and add the data 
$row = $table.NewRow() 
$row.Name = "Test" 
$lastCommit = GetDateFromExternalApp 
$lastCommit.GetType() # this returns DateTime as I would expect 
$row.DateFromServer = $lastCommit # this throws up an error 
$table.Rows.Add($row) 

# Output the table 
$table | Format-Table -AutoSize 

# This function simulates what the actual function does 
# (the real one goes to SVN and pulls down data, but it 
# ends up with the same resulting date) 
Function GetDateFromExternalApp 
{ 
    $externalAppDate = "2012-09-17T16:33:57.177516Z" 

    return [DateTime]($externalAppDate) 
} 

(위의 스크립트에 주석에서 언급) 문제는 그 기능이 나는 테이블 행의이 점을 추가하려고하면 행복하게하는 날짜 시간 인스턴스를 반환 할 것 같다 동안 DateFromServer 열은 오류까지 던지고 :

Exception setting "DateFromServer": "Unable to cast object of type 'System.Management.Automation.PSObject' to type 'System.IConvertible'.Couldn't store <18/09/2012 2:33:57 AM> in DateFromServer Column. Expected type is DateTime." At line:13 char:6 
+ $row. <<<< DateFromServer = $lastCommit 
    + CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifiedErrorId : PropertyAssignmentException 

그러나, $ lastCommit.GetType()에 대한 호출이 참으로 날짜 시간임을 보여줍니다 - 사실 나는 스크립트 어딘가에 줄을 추가하는 경우 :

$lastCommit 

후, 나는 실제로 그것을 분석하고 올바르게 변환하는 것을 제안, 멋지게 형식의 날짜를 볼 수 있습니다

Date  : 18/09/2012 12:00:00 AM 
Day   : 18 
DayOfWeek : Tuesday 
DayOfYear : 262 
Hour  : 2 
Kind  : Local 
Millisecond : 177 
Minute  : 33 
Month  : 9 
Second  : 57 
Ticks  : 634835324371775160 
TimeOfDay : 02:33:57.1775160 
Year  : 2012 
DateTime : Tuesday, 18 September 2012 2:33:57 AM 

따라서 나는 위의 예외를 받고 있어요 이유에 매우 의아해 해요. PowerShell은 C#과 다르게 반환 값을 함수로 처리한다는 것을 알지만, 함수가 올바른 형식을 반환하는 것처럼 보입니다.

답변

3

이 동작에 대한 이유도 알고 싶습니다.

어쨌든 DateTime으로 날짜 변수를 캐스팅하거나 명시 적으로 1로 선언하여이 문제를 해결할 수 있습니다.

"유형의 개체를 캐스팅 할 수 없습니다 '선택 System.Management.Automation.PSObject'

... 
$row.DateFromServer = [DateTime]$lastCommit # Doesn't throw exception 
... 

또는

... 
[DateTime]$lastCommit = GetDateFromExternalApp 
$row.DateFromServer = $lastCommit # Doesn't throw exception 
... 
+0

고마워요! 그 일은 훌륭했습니다. 예, 나에게도 논리적으로 보이지는 않지만, PowerShell을 처음 접했을 때 표준에 대한 확신이 없었습니다. – John

0

, 그래서 같이 나는 오류 메시지에 명시된 이유는 의심 'System.IConvertible'... 예상되는 형식은 DateTime입니다. " 줄에서 : 13 문자 : 6

무슨 말인지, PowerShell은 $ lastCommit을 날짜와 시간으로 변환하려고 시도했지만 실패했습니다.) ( $의 lastcommit.gettype()와 $ row.DateFromServer.gettype

을 : 더 명확하게 문제를 확인하려면

[날짜]에 캐스팅 모두보고 시도 - 가장 좋은 방법은 vonPryz에서 알 수 있듯이이다

은 내가 GetDateFromExternalApp 인해 PowerShell을의 유형 적응 시스템의 버그 (아직 수행하지 않은 경우 내가 reporting this to Microsoft를 추천 할 것)에

+0

질문의 예제 코드에는 문제를 재현하는 더미 GetDateFromExternalApp 함수가 포함되어 있습니다. – vonPryz

+0

이 getdatefromexternalapp를 사용하면 여기에서 문제가 재현되지 않습니다. 이 코드를 실행하면 다음과 같이 표시됩니다. 이름 날짜 서버 ---- -------------- 테스트 9/17/2012 5:33:57 PM –

+0

내 시스템에서도 마찬가지입니다. . 어떤 PSH 버전을 사용하고 계십니까? 이 함수는 작동합니다. $ row.DateFromServer = $ lastCommit 부분도 시도 했습니까? – vonPryz

4

여기에서 문제가 확인 할 필요가 없습니다.

PowerShell에서 개체로 작업 할 때 실제로는 PSObject 래퍼로 작업하고 있습니다.PowerShell을 가지고,이는 문제가되지 않습니다

PS> Get-Date | Add-Member NoteProperty Yowza 'for example' -PassThru | Format-List y* 
Yowza : for example 
Year : 2012 


일반적으로 : 당신은 개체 자체와 상호 작용하지 않는 추가 구성원을 추가 할 수 있지만 대부분의 전화는 (GetType를 등) 기본 객체로 전달됩니다 광범위한 유형 강제 변환 기능. 그러나 DataRow의 경우 속성 액세스 구문을 지원하는 데 사용되는 DataRowAdapter 유형의 버그가있는 것으로 보입니다. 직접 the indexer을 사용하는 경우 $row.DateFromServer 대신 $row['DateFromServer'] = $lastCommit을 사용하면 값을 .NET 유형으로 보내기 전에 값의 포장을 해제해야합니다. 또는 BaseObject ($lastCommit.PSObject.BaseObject)를 검색하여 :

또한 값을 직접 풀기, 중 ([DateTime]$lastCommitvonPryz already showed 등) 캐스트를 사용하면이 문제를 해결할 수 있습니다.

+0

감사합니다. 문제는 내 데이터를 데이트 데이트 퍼팅 내 머리를 두드리는, 그리고이 고정. – mbourgon

관련 문제