我尝试从我的csv文件转换日期,但是遇到错误:无法将null转换为'System.DateTime'类型。
重现错误的示例:
$some_string = "(PDH-CSV 4.0) (E. South America Daylight Time)(120),\\NA\Process(w3wp_10060)\% Processor Time,\\NA\Process(w3wp_10060)\% User Time,\\NA\Process(w3wp_10060)\% Privileged Time,\\NA\Process(w3wp_10060)\Page Faults/sec,\\NA\Process(w3wp_10060)\Working Set,\\NA\Process(w3wp_10060)\Private Bytes,\\NA\Process(w3wp_10060)\Thread Count,\\NA\Process(w3wp_10060)\Handle Count`n" + "10/29/2014 09:37:41.056, , , , ,55205888,44847104,26,471`n" + "10/29/2014 09:37:46.931,0,0,0,0.17039241953890988,55209984,44847104,26,471`n" + "10/29/2014 09:37:52.806,0,0,0,0,55209984,44847104,26,471`n" $datasource = $some_string | ConvertFrom-Csv -Delim ',' foreach ($datapoint in $datasource) { $date = [DateTime]$datapoint.$StrData Write-Host $date }
[编辑]
这种方式有效:
$date = [DateTime]$datapoint.'(PDH-CSV 4.0) (E. South America Daylight Time)(120)'
有什么建议吗?
答案 0 :(得分:2)
根本原因是没有使用Set-PSDebug -Strict
或Set-Strictmode -version latest
。严格模式有几个sanity checks:
在严格模式下,你会得到像
这样的合理错误The variable '$StrData' cannot be retrieved because it has not been set.
The variable '$date' cannot be retrieved because it has not been set.
而不是混淆
Cannot convert null to type "System.DateTime".
在指定严格模式后,很容易注意到$StrData
变量未初始化,因此尝试$datapoint
的不存在的成员是徒劳的。
答案 1 :(得分:0)
CB有一个未解答的问题,他在询问$StrData
是如何填充的。你仍然没有明确地解决这个问题,但在编辑中你有这个:
$date = [DateTime]$datapoint.'(PDH-CSV 4.0) (E. South America Daylight Time)(120)'
这表明您希望$strData
成为第一列的列标题。我将假设这可能会发生变化,并且静态分配值并不是您想要的。在这种情况下,您可以执行的操作是获取第一列名称并将其分配给$strData
,这将使脚本的其余部分工作。
$strdata = $datasource | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name -First 1
使用Get-Member
我们得到代表csv标头的note属性。展开第一个返回的名称(PDH-CSV 4.0)(E。南美夏令时)(120)'。这会变成一个变量。可以在定义$datasource
之后放置代码。如果这不是您的意图,请更新您的帖子,了解有关$strData
。