我有两个简单的一行“脚本”。它们检查某个文件夹中的某些文件有多旧。一个将输出显示到屏幕上,另一个将输出写入桌面上的文本文件。两个“.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
您将日期转换为字符串,并在 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
}
}