Powershell从最新目录获取文件

时间:2014-01-21 21:55:42

标签: powershell

我正在尝试编写一个脚本来从以昨天的日期命名的文件中获取行,并将这些行发送到文件。诀窍是我必须在最新创建的目录中搜索,因为根目录中有许多目录。

我有一个根目录C:\Orders,其中包含许多名为Orders 2014.01.02Orders 2014.01.04Orders 2014.01.06等的子目录,其中包含数千个txt文件,并且在一个特定的orders.txt中我有这样的行:

2014.01.02 Shipping order cost ....
2014.01.02 Order by phone
2014.01.03 Prepaid ..
etc ..

所以我需要一个脚本进入目录Orders with latest day,让我们说Orders 2014.01.06,然后将所有以前一天的日期开头的行复制并发送给我。

我已设法制作一个脚本,以便从最新目录中的文件获取行,并使用此脚本通过邮件将其发送给我:

Get-Content "C:\Orders\Orders 2014.01.06\orders.txt" | Where-Object {$_.StartsWith((Get-Date).AddDays(-1).ToString("yyyyMMdd"))} | Out-File "C:\Orders\Result_orders.txt"

事情是这不灵活,因为我必须在每次有新文件夹时手动更改行中的最新子文件夹。

我有另一行代码向我展示根文件夹中的最新子文件夹:

gci C:\Orders | where-object { $_.PSIsContainer} | sort CreatiionTime -desc | select -f 1

这一行显示了我想要获得结果的最新日期的文件夹。 问题是我不能让两行都在脚本中工作。我试图将它们结合起来,但是无法做到。我试图将第二个命令作为变量,如:

$since_folder = gci C:\Orders\ | where-object { $_.PSIsContainer} | sort CreatiionTime -desc | select -f 1 

然后从第一行脚本中调用它,如:

Get-Content "$since_folder\orders.txt" | Where-Object {$_.StartsWith((Get-Date).AddDays(-1).ToString("yyyyMMdd"))} | Out-File "C:\Orders\Result_orders.txt"

但它似乎不对,它不起作用。实际上我在运行最后一个脚本后收到了一封电子邮件,但我没有得到附件。如果我跑的话我才会得到它:

Get-Content "C:\Orders\Orders 2014.01.06\orders.txt" | Where-Object {$_.StartsWith((Get-Date).AddDays(-1).ToString("yyyyMMdd"))} | Out-File "C:\Orders\Result_orders.txt"

任何人都可以帮我解决这个剧本,它可能很简单,但我在这里碰壁。

3 个答案:

答案 0 :(得分:0)

以下内容将返回当前文件夹中最近创建的目录的名称:

Get-ChildItem -Directory | sort -Descending -Property CreationTime | select -first 1 name

答案 1 :(得分:0)

$since_folder = gci C:\Orders\ |
    where { $_.PSIsContainer } |
    sort CreationTime -desc |
    select -f 1

$filename = [System.IO.Path]::Combine( $since_folder.FullName, "orders.txt" ) # ends up with c:\orders\Orders 2014.10.21\orders.txt

Get-Content $filename |
    where { $_.StartsWith((Get-Date).AddDays(-1).ToString("yyyyMMdd")) } |
    Out-File "C:\Orders\Result_orders.txt"

这会让你走出硬编码的道路。

答案 2 :(得分:0)

以下内容检索最近创建的目录,过滤" orders.txt",然后根据提供的更新模式检索与昨天匹配的行:

gci "C:\Orders" |
  Where-Object { $_.PSIsContainer} |
  sort CreationTime -desc |
  select -f 1 |
  gci -Filter "orders.txt" |
  Get-Content |
  Where-Object { $_.StartsWith((Get-Date).AddDays(-1).ToString("yyyyMMdd")) } |
  Out-File "C:\Orders\Result_orders.txt"

PowerShell 3允许直接在Get-ChildItem中过滤目录:

gci "C:\Orders" -Directory |
  sort CreationTime -desc |
  select -f 1 |
  gci -Filter "orders.txt" |
  Get-Content |
  Where-Object { $_.StartsWith((Get-Date).AddDays(-1).ToString("yyyyMMdd")) } |
  Out-File "C:\Orders\Result_orders.txt"