PowerShell查找最新文件

时间:2016-09-08 20:13:13

标签: powershell

我是PowerShell和脚本的新手。做了很多阅读和测试,这是我的第一篇文章 这是我想要做的。我有一个文件夹,其中包含每天运行的每个报告的子文件夹。每天都会创建一个新的子文件夹 子文件夹中的文件名相同,只有日期更改。 我想从昨天的文件夹中获取一个特定的文件 以下是我到目前为止的情况:

Get-ChildItem -filter “MBVOutputQueriesReport_C12_Custom.html” -recurse -path D:\BHM\Receive\ | where(get-date).AddDays(-1)  

两个部分(管道前后)都有效。但是当我把它们组合起来时就失败了 我做错了什么?

5 个答案:

答案 0 :(得分:1)

  

我做错了什么?

0,1,2,3,4,5 | Where { $_ -gt 3 }

这将比较管道($_)与3的传入号码,并允许大于3的事物超过它 - 只要$_ -gt 3测试评估为$ True

0,1,2,3,4,5 | where { $_ }

这没有什么值得比较的 - 在这种情况下,它casts the value to boolean - 'truthy' or 'falsey'并且将允许一切'真实'通过。 0被删除,其余被允许。

Get-ChildItem | where Name -eq 'test.txt'
没有{}的语法是一种语法,它希望Name 是通过管道输入的东西的属性(在这种情况下是文件名)并将它们与' test.txt'并且只允许具有该名称的文件对象通过。

Get-ChildItem | where Length

在这种情况下,它正在寻找的属性是Length(文件大小),并且没有给出比较,所以它回到了之前的“cast to true / false”事物。这将仅显示具有某些内容(非0长度)的文件,并且将丢弃0个大小的文件,例如。

好吧,这让我知道你的代码:

 Get-ChildItem | where(get-date).AddDays(-1)

没有{}且只有一件事给了Where,它期望参数是属性名,并且将该属性的值转换为true / false以决定做什么。这就是说“过滤器中管道中的东西有一个名为("09/08/2016 14:12:06"的属性(昨天的当前时间日期)),并且该属性的是'truthy'”。没有文件有一个名为(昨天的日期)的属性,因此该问题会为每个文件读取$null,而Where会删除管道中的所有内容。

您可以像Jimbo一样回答,并过滤文件的写入时间昨天的日期进行比较。但是如果您知道文件和文件夹是按日期顺序命名的,那么您可以保存 - 遍历整个文件夹树并查看所有内容,因为您知道将调用昨天的文件。

虽然你没说,你可以采取像

这样的方法
$yesterday = (Get-Date).AddDays(-1).ToString('MM-dd-yyyy')
Get-ChildItem "d:\receive\bhm\$yesterday\MBVOutputQueriesReport_C12_Custom.html"

# (or whatever date pattern gets you directly to that file)

Get-ChildItem | sort -Property CreationTime -Descending | Select -Skip 1 -First 1

获取“最后但一个”的东西,按反向创建日期排序。

答案 1 :(得分:0)

尝试:

where {$_.lastwritetime.Day -eq ((get-date).AddDays(-1)).Day}

答案 2 :(得分:0)

您可以将结果传递给Sort命令,并将其传递给Select以获取第一个结果。

Get-ChildItem -filter “MBVOutputQueriesReport_C12_Custom.html” -recurse -path D:\BHM\Receive\ | Sort LastWriteTime -Descending | Select -First 1

答案 3 :(得分:0)

get-date | Get-Member -MemberType Property读取输出,然后应用Where-Object docs

Get-ChildItem -filter “MBVOutputQueriesReport_C12_Custom.html” -recurse -path D:\BHM\Receive\ | `
    Where-Object {$_.LastWriteTime.Date -eq (get-date).AddDays(-1).Date}

答案 4 :(得分:0)

可以做这样的事情。

$time = (get-date).AddDays(-1).Day
Get-ChildItem -Filter "MBVOutputQueriesReport_C12_Custom.html" -Recurse -Path  D:\BHM\Receive\ | Where-Object { $_.LastWriteTime.Day -eq $time }