Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell get childitem排除一系列日期_Powershell - Fatal编程技术网

Powershell get childitem排除一系列日期

Powershell get childitem排除一系列日期,powershell,Powershell,我使用Get ChildItem来获取日期不等于当前日期/今天的所有tomcat日志文件。我想获取日期不在日期范围内的tomcat日志文件。例如,不应列出最近7天的文件名 tomcat日志文件名示例: catalina.2018-12-21.日志 host-manager.2018-12-21.log $date=Get-Date (get-date).addDays(-0) -UFormat "%Y-%m-%d" $file=Get-ChildItem "C:\tomcat\logs" -ex

我使用Get ChildItem来获取日期不等于当前日期/今天的所有tomcat日志文件。我想获取日期不在日期范围内的tomcat日志文件。例如,不应列出最近7天的文件名

tomcat日志文件名示例:
catalina.2018-12-21.日志
host-manager.2018-12-21.log

$date=Get-Date (get-date).addDays(-0) -UFormat "%Y-%m-%d"
$file=Get-ChildItem "C:\tomcat\logs" -exclude "*$date*"

foreach($files in $file)
{
    Move-Item -Path $files -Destination "C:\expiredlogs"
}

[.....]Get all of the logs filename where date is not in the last 7 days range from "C:\expiredlogs"

有没有什么好的、有效的方法来检索7天前到现在不在范围内的所有文件名?

我假设您只想获取所有文件,而不管它们的名称如何。到目前为止,您都是基于文件名本身进行搜索,但也可以基于文件的属性进行搜索。在这个例子中,我得到的所有文件都是7天或更新的

$files=Get-ChildItem "C:\tomcat\logs" | Where-Object LastWriteTime -gt (Get-Date).AddDays(-7).Date

foreach($file in $files)
{
    Move-Item -Path $file -Destination "C:\expiredlogs"
}
上面的代码将只查看文件的写入时间,而不考虑文件名。如果需要的话,可以通过应用其他过滤器进一步限制


根据@LotPings的建议进行更新

如果您坚持使用文件名,则需要将文件名解析为日期,因为Get ChildItem不知道日期。像这样的事情应该可以做到:

Get-ChildItem "c:\programdata\dgs\cathi\log" | `
where { ([DateTime]::ParseExact($_.Name.Substring($_.Name.Length-14,10),'yyyy-MM-dd', $null) -lt (Get-Date).addDays(-7))} 

数字14不是一个神奇的数字,它是日期的长度+“.log”。

上述使用
LastWriteTime
的方法是正确的。但是,如果文件名中有时间戳,那么过滤可能比
Where Object
更有效,并且可以为其提供数组

首先创建一个应排除的日期数组:

$range =  -3 .. -5 | ForEach-Object { "*$(Get-Date (Get-Date).addDays($_) -UFormat '%Y-%m-%d')*" }
今天返回:

*2018-12-18*
*2018-12-17*
*2018-12-16*
并将其传递给
获取子项

Get-ChildItem "C:\tomcat\logs" -Exclude $range

在我看来,对一组文件使用复数形式的
$files
,对当前迭代的文件使用单数形式的
$file
更有意义。获取日期将包括当前时间、附加
.date
或使用
Where Object LastWriteTime-lt[datetime]::Today
Cheers@LotPings!没有读他的代码,我只是用我的过滤逻辑进行了调整。谢谢你指出这一点。将从现在开始尝试升级我的游戏:)