“PowerShell ISE”和“使用 PowerShell 运行”之间的结果不同

“PowerShell ISE”和“使用 PowerShell 运行”之间的结果不同

我有两个简单的一行“脚本”。它们检查某个文件夹中的某些文件有多旧。一个将输出显示到屏幕上,另一个将输出写入桌面上的文本文件。两个“.ps1”脚本文件都保存在桌面上。使用“使用 PowerShell 运行”运行任一“.ps1”文件都会得到不正确的结果。当通过 PowerShell ISE 运行任一“.ps1”文件时,结果不同(并且正确)。

第一个脚本:

cd G:\moveh\back
Get-ChildItem -filter "*.rar" | Foreach-Object {  if ( ((get-date).toshortdatestring() ) -gt ($_.lastwritetime.toshortdatestring() )  ) { "{0}   {1}" -f $_.name,$_.lastwritetime.toshortdatestring()} }

cmd /c pause

第二个脚本:

Get-ChildItem $allfolders | where {$_.Name -notlike "*closed"} | gci -   Recurse -File -filter "Data.rar" | where {( ($_.lastwritetime.toshortdatestring()) -lt ((get-date).AddDays(-1).ToShortDateString() ) ) } | format-table -autosize -Property Directory, Name, LastWriteTime > C:\Users\itsupport\Desktop\Files_2b_updated_DB.txt

第一个脚本的两个不同结果的示例截图:

1

知道为什么会有不同的结果吗?

答案1

您将日期转换为字符串,并在 ISE 和 PowerShell 控制台中产生不同的结果。

查看你的from073.rar文件:

  • ISE 日期:10/05/2015
  • PowerShell 控制台日期:5/10/2015

你最好直接删除.ToShortDateString()并比较日期。请参阅此问题:Powershell:比较日期

尽管 ISE 和 PowerShell 控制台中的字符串呈现方式不同,但比较是同类的,因此结果应该相同。

是的,但是你的“苹果”在这种情况下是字符代码,我确信这不是您想要比较的内容。例如:

  • 'a' -gt 'b'false,因为 的字符代码a低于 的字符代码b

  • 'ac' -gt 'ab'true,因为a两个字符串的字符代码相同,但是左边字符串的下一个字符代码(c)大于右边字符串的第二个字符代码(b)。

因此,当您在使用格式的 ISE 中运行代码时dd/mm/yyyy,您的代码只会比较第一dd部分并忽略mm/yyyy,因为它恰好相同。而且您纯属偶然地获得了正确的结果。在 PowerShell 控制台中,日期格式为mm/dd/yyyy,因此您的代码会按预期中断。

这是我的新台词:

Get-ChildItem -filter "*.rar" |
    Foreach-Object {
        if((get-date $_.lastwritetime -Format d) -lt (Get-Date -Format d ))
        {
            "{0} {1}" -f $_.name, (get-date $_.lastwritetime -Format d)
        }
    }

但这种比较不起作用。

再次说明:您正在使用-Format d,它将日期对象转换为字符串。并且您已经知道它会导致什么。

如果你想获取超过一天的文件,你的代码应该是这样的(注意,两个约会时间直接比较对象,不涉及字符串):

Get-ChildItem -Filter '*.rar' |
        Foreach-Object {
            if($_.LastWriteTime -lt (Get-Date).AddDays(-1))
            {
                '{0} {1}' -f $_.Name, $_.LastWriteTime
            }
        } 

相关内容