PowerShell过滤文件名范围

时间:2014-07-08 08:28:02

标签: powershell

我试图在PowerShell v2.0中编写一个非常简单的(据我所知:-))脚本。

每天早上我都需要查看一些文件来检查它们是否是最新的。 所有文件都在同一个文件夹中。

这些文件的名称如下:from1.rar,from2.rar from13.rar,from14.rar,from27.rar,from29.rar等。如您所见,文件位于不同的范围内。我想按照我确定的范围过滤文件的名称。我想正则表达式会做到这一点,但我不知道如何使用它......

我现在所拥有的只是将按时间和名称对所有文件进行过滤和排序到一个表中:

Get-ChildItem -filter "*.rar" | sort LastWriteTime -Descending | sort name | Format-Table LastwriteTime, name > C:\Users\user1\Desktop\update.txt

现在我想打破表格,从文件名中形成一些组(或更小的表)。

3 个答案:

答案 0 :(得分:0)

这样的事情可以解决问题:

$low  = 10
$high = 25
Get-ChildItem -Filter '*.rar' | ? {
  $_.Name -match 'from(\d+)\.rar' -and
  [int]$matches[1] -gt $low -and
  [int]$matches[1] -le $high
} | ...

演示:

PS C:\> $files = 'from1.rar','from13.rar','from14.rar','from27.rar','from29.rar'
PS C:\> $files
from1.rar
from13.rar
from14.rar
from27.rar
from29.rar
PS C:\> $files | ? {
>>   $_ -match 'from(\d+)\.rar' -and
>>   [int]$matches[1] -gt $low -and
>>   [int]$matches[1] -le $high
>> }
>>
from13.rar
from14.rar

答案 1 :(得分:0)

要将表分成几组表,只需将-GroupBy参数添加到cmdlet Format-Table

例如,要为每个文件的属性Name创建一个表:

Get-ChildItem -filter "*.rar" | sort LastWriteTime -Descending | sort name | Format-Table LastwriteTime, name -GroupBy Name

但是如果您有很多文件,那么可能会生成太多组,因此您可以将表分组到Name属性的第一个字母上,如下所示:

Get-ChildItem -filter "*.rar" | sort LastWriteTime -Descending | sort name | Format-Table LastwriteTime, name -GroupBy @{name="First Letter";E={ ($_.name).substring(0,1) }}

或者,要将表格分组到Name属性的前两个字母:

Get-ChildItem -filter "*.rar" | sort LastWriteTime -Descending | sort name | Format-Table LastwriteTime, name -GroupBy @{name="First Letter";E={ ($_.name).substring(0,2) }}

答案 2 :(得分:0)

这是使用正则表达式的一种方法:

$range = 5..10

get-childitem From*.rar | 
where {$range -contains ($_.name -replace 'From(\d+)\.rar','$1')}