【问题标题】:PowerShell v2.0 - Converting to DateTimePowerShell v2.0 - 转换为日期时间
【发布时间】:2017-05-29 05:42:05
【问题描述】:

我有一些日期变量,用于对特定目录中的文件执行查询。我可以GCI每个文件都没有问题,如下例所示:

File1.xml 14/07/2016 17:09
File2.xml 15/07/2016 09:32

所以我正在搜索特定年龄段之间的所有文件,我的标准是:

早于:

$Today4am = Get-Date -Hour 4 -Minute 0 -Second 0

但晚于

$Yesterday4am = $Today4am.AddDays(-1)

变量输出

$Today4am = 15 July 2016 04:00:00
$Yesterday4am = 14 July 2016 04:00:00

所以变量以不同的格式将日期输出到文件本身,所以我需要确保两种格式相同才能进行比较。这是原始脚本:

$Filter = gci c:\temp\*.xml |
Where {$_.LastWriteTime -gt $Yesterday4am -and {$_.LastWriteTime-lt $Today4am}}

运算符“-gt”的参数错误:无法将“14/07/2016 17:09:52”与“14/07/2016 0”进行比较 4:00”。错误:“无法将值“14/07/2016 04:00”转换为类型“System.DateTime”。错误: "字符串未被识别为有效的日期时间。""。

所以我尝试将变量转换为添加 -Format "dd/MM/yyyy HH:mm" 并输出正确的格式。但是转换 $Yesterday4am = $Today4am.AddDays(-1) -Format "dd/MM/yyyy HH:mm" 会产生错误:

Cannot convert value "15/07/2016 04:00" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."

我怎样才能让两种日期格式一致?

【问题讨论】:

    标签: powershell datetime


    【解决方案1】:

    再次尝试使用Get-date$Yesterday4am 转换为DateTime

    | Where {$_.LastWriteTime -gt (Get-Date $Yesterday4am) -and {$_.LastWriteTime-lt $Today4am}}
    

    如果您担心性能,您可以在 Where 运算符之外进行 Get-Date 转换:

    $Yesterday4am = Get-Date $Yesterday4am
    $Filter = gci c:\temp\*.xml `
        | Where {$_.LastWriteTime -gt $Yesterday4am -and {$_.LastWriteTime-lt $Today4am}}
    

    【讨论】:

    • 这将为它必须进行比较的每个项目调用 Get-Date。对于少量文件可能没什么大不了的,但如果您要搜索大量 XML 文件,则可能需要很长时间。
    • 22,000 在目录中,因此过滤!
    【解决方案2】:

    我相信这只是您比较的问题。如果你在下面运行我的脚本,你会看到它们都是“DateTime”类型。如果您将它们格式化,它们将成为不易比较的字符串。当我在下面运行我的 Where-Object 命令时,我没有任何错误。注意:我使用的是 PowerShell 版本 5。

    PS> Write-Host "PowerShell Version: $($PSVersionTable.PSVersion.ToString())"
    PowerShell Version: 5.0.10586.122
    
    PS> $Today4am = Get-Date -Hour 4 -Minute 0 -Second 0
    
    PS> Write-Host "`$Today4am is type `"$($Today4am.GetType().FullName)`""
    $Today4am is type "System.DateTime"
    
    PS> $Yesterday4am = $Today4am.AddDays(-1)
    
    PS> Write-Host "`$Yesterday4am is type `"$($Yesterday4am.GetType().FullName)`""
    $Yesterday4am is type "System.DateTime"
    
    PS> $Filter = Get-ChildItem c:\temp\* | Where-Object -FilterScript { ( $_.LastWriteTime -gt $Yesterday4am ) -and ( $_.LastWriteTime-lt $Today4am ) }
    
    PS> $Filter
    
    Directory: C:\temp
    
    
    Mode                LastWriteTime         Length Name                                                                                                                                                                                   
    ----                -------------         ------ ----                                                                                                                                                                                   
    -a----        7/14/2016   1:13 PM              0 asdfasd 
    

    【讨论】:

    • 超级!谢谢 - 工作一种享受!所以 -filterscript 是我脚本的关键 - 不知道它是什么,但会查找它
    • 它实际上是Where-Object(Where)的默认参数,但我只是指定我调用的内容以便人们知道。这可能是因为您在 FilterScript {} 表达式括号内使用了 {} 表达式括号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多