我有一个PowerShell脚本,它根据我的要求读取CSV文件并过滤掉数据,但问题是它只适用于我的Windows 8.1系统,而不是其他任何地方。准确地说-gt
运算符,如果我将-gt
更改为lt
,le
等,该脚本将在其他系统上运行。
以下是剧本。
$date1 = Date ("{0:MM/dd/yyyy}" -f (get-date).AddDays(-1)) -format G
echo $date1
Import-Csv C:\avaya\2014.04.csv | Where-Object { $_.Party1Name -eq "User_Name" -and $_.'Call Start' -gt ( $date1 ) } | Export-Csv -Path "result.csv" -NoTypeInformation
答案 0 :(得分:7)
-gt
正在按预期工作。问题是您正在尝试将字符串值与-gt
进行比较。要比较日期,它们需要是DateTime
- 对象。导入CSV文件时,所有值都将作为字符串导入。您需要将日期转换回DateTime
- 对象。例如:
$date1=(get-date).AddDays(-1)
echo $date1
Import-Csv C:\avaya\2014.04.csv | Where-Object { $_.Party1Name -eq "User_Name" -and ($_.'Call Start' -as [datetime]) -gt $date1 } | Export-Csv -Path "result.csv" -NoTypeInformation
答案 1 :(得分:2)
它没有按照你期望的方式工作,因为你所做的是字符串比较,而不是日期比较。
CSV文件中包含的是日期字符串。使用比较运算符时,PowerShell将基于左侧的对象类型进行比较,并在必要时将右侧强制转换为相同类型以执行操作。从日期时间对象开始,并将其放在左侧,PowerShell会将右侧的字符串强制转换为日期时间:
$date1 = (get-date).AddDays(-1)
echo $date1
Import-Csv C:\avaya\2014.04.csv |
Where-Object { $_.Party1Name -eq "User_Name" -and $date1 -lt $_.'Call Start' } |
Export-Csv -Path "result.csv" -NoTypeInformation