我有一个PowerShell脚本几乎可以满足我的需要。
基本上,有一些CSV文件源会写入特定位置并按年和月存储。我必须比较两个最新CSV文件之间的行数,因为一个很大的差异表明存在问题。
目前我的脚本获取最新的CSV文件并返回行计数没有问题,但我无法弄清楚如何让它返回2个最新文件的行数。这很可能是由于我构建脚本的方式:
$datemonth = (Get-Date).Month
$dateyear = (Get-Date).Year
## get latest csv files
$dir = "\\160.1.1.98\c$\Scheduled Task Software\ScheduledTask\Application Files\ScheduledTask_1_0_0_9\Files\$dateyear\$datemonth\SentFeedFiles"
$latest = Get-ChildItem -Path $dir |
Sort-Object LastAccessTime -Descending |
Select-Object -First 1
## get path to csv files, add headers and count number of rows.
$filepath = $dir + '\' + $latest
$CSVCOUNT = (Import-Csv $filepath -Header 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28).Count
如果我更改为-First 2
,则会收到以下错误:
Import-Csv:找不到文件'\ 16.1.1.18 \ c $ \ Scheduled Task Software \ ScheduledTask \ Application Files \ ScheduledTask_1_0_0_9 \ Files \ 2017 \ 3 \ SentFeedFiles \ lkrlkr200317.csv lkrlkr19017.csv'。
我知道为什么我收到此错误 - 它试图将两个文件名连接到一个路径中。但是,我无法解决这个问题。我想可能需要一个循环,但我不确定在哪里。
答案 0 :(得分:1)
在本地f:\ tmp中删除3个CSV文件以进行测试:
$dir = "F:\tmp"
$files = Get-ChildItem -Path $dir | Sort-Object LastAccessTime -Descending | Select-Object -First 2
($files | Get-Content).Count
Import-Csv只处理单个文件,因此我无法将两个文件路径传递给它。
如果您想使用Import-CSV(用于忽略标题等),您可以预先处理文件,但必须将完整路径传递给它:
($files.FullName | % { Import-Csv -Path $_ }).Count
要获得两个单独的结果,请执行以下操作:
包含标题:
($files[0] | Get-Content).count
($files[1] | Get-Content).count
排除标题:
(Import-Csv -Path $files[0].FullName).Count
(Import-Csv -Path $files[1].FullName).Count