我有一个包含.xls文件的目录,其名称如下:
Recon_ [帐号] _ [YYYYMMDD] .xls
e.g:
Recon_9020111006076954416_20131216.xls
帐号可以是16到20之间的任意数字。
我需要获取此文件夹中的项目列表 - 但只有帐号。
如果我能得到一个帐号列表然后在它们旁边创建文件的日期(可以是文件名中的日期戳或文件的最后修改日期),那将是什么奇妙的,在YYYY / MM / DD格式,按日期排序。
像这样:
9020111006076954416 2013/12/16
10201129080000235952 2013/12/17
然后,我需要在文本文件中使用此帐户列表,甚至更好的是excel文件。有什么想法吗?
答案 0 :(得分:1)
相当简单,实际上:
首先获取原始数据
Get-ChildItem *.xls |
然后从中提取您需要的属性:
ForEach-Object {
if ($_.Basename -match '^Recon_(?<account>\d+)_(?<date>\d+)$') {
$_ | Add-Member NoteProperty AccountNumber $Matches.account
}
} |
选择您感兴趣的属性(我们仍在处理原始FileInfo
对象,我们只是添加了帐号):
Select-Object AccountNumber,LastWriteTime
你也可以使标题更好:
Select-Object @{l='Account Number'; e={$_.AccountNumber}}, @{l='Date'; e={$_.LastWriteTime}}
此时你可以很好地在屏幕上显示一些东西。然后,您可以通过将数据汇总到另一个ForEach-Object
:
ForEach-Object {
'{0}`t{1:yyyy-MM-dd}' -f $_.AccountNumber, $_.LastWriteTime
}
或通过管道传输到ConvertTo-Csv
:
ConvertTo-Csv foo.csv
回顾一下:
$data = Get-ChildItem *.xls |
ForEach-Object {
if ($_.Basename -match '^Recon_(?<account>\d+)_(?<date>\d+)$') {
$_ | Add-Member NoteProperty AccountNumber $Matches.account
}
} |
Select-Object AccountNumber,LastWriteTime
$data | ForEach-Object {
"{0}`t{1:yyyy-MM-dd}" -f $_.AccountNumber, $_.LastWriteTime
} | Out-File foo.txt
$data | ConvertTo-Csv foo.csv
答案 1 :(得分:1)
尝试一下:
Get-ChildItem -Filter *.xls | Where-Object {$_.BaseName -match '^Recon_\d{16,20}_\d+$'} | ForEach-Object{
$id,$date = $_.BaseName.Split('_')[1..2]
New-Object PSObject -Property @{
AccountNumber = $id
DateCreated = $date.Insert(4,'/').Insert(7,'/')
}
} | Export-Csv itemList.csv -NoTypeInformation
答案 2 :(得分:0)
获取此目录的所有文件。在循环中获取文件名并将其拆分为&#39; _&#39;。数组的第二项是帐号,第三项是日期。