所以我正在尝试处理CSV文件,然后给输出新名称。我可以通过显式指定文件名来使用一个文件。但是有没有一种方法/通配符可以让脚本同时处理多个文件?我们只想说我想用.csv作为扩展来处理任何事情。这是我用来处理特定文件的脚本
$objs =@();
$output = Import-csv -Path D:\TEP\FilesProcessing\Test\file1.csv | ForEach {
$Object = New-Object PSObject -Property @{
Time = $_.READ_DTTM
Value = $_.{VALUE(KWH)}
Tag = [String]::Concat($_.SUBSTATION,'_',$_.CIRCUITNAME,'_',$_.PHASE,'_',$_.METERID,'_KWH')
}
$objs += $Object;
}
$objs
$objs | Export-CSv -NoTypeInformation D:\TEP\FilesProcessing\Test\file1_out.csv
你可以结合Get-ChildItem
和Import-Csv
。
这是一个示例,它指定不同的输入和输出目录以避免名称冲突:
$inputPath = "D:\TEP\FilesProcessing\Test"
$outputPath = "D:\TEP\FilesProcessing\Output"
Get-ChildItem (Join-Path $inputPath "*.csv") | ForEach-Object {
$outputFilename = Join-Path $outputPath $_.Name
Import-Csv $_.FullName | ForEach-Object {
New-Object PSObject -Property @{
"Time" = $_.READ_DTTM
"Value" = $_.{VALUE(KWH)}
"Tag" = "{0}_{1}_{2}_{3}_KWH" -f $_.SUBSTATION,$_.CIRCUITNAME,$_.PHASE,$_.METERID
}
} | Export-Csv $outputFilename -NoTypeInformation
}
请注意,不需要创建数组并重复附加数组。只需输出您想要的自定义对象并在之后导出。
使用Get-Childitem
并删除所有不必要的中间变量,以便您以更多Powershell类型的方式对其进行编码。像这样的东西:
Get-CHhilditems 'D:\TEP\FilesProcessing\Test\*.csv' | % {
Import-csv $_.FullName | % {
New-Object PSObject -Property @{
Time = $_.READ_DTTM
Value = $_.{VALUE(KWH)}
Tag = '{0}_{1}_{2}_{3}_KWH' -f $_.SUBSTATION, $_.CIRCUITNAME, $_.PHASE, $_.METERID
}
} | Export-CSv ($_.FullName -replace '\.csv', '_out.csv') -NoTypeInformation
}
Get-ChildItem对于这样的情况非常有用。
您可以将通配符直接添加到路径中:
Get-ChildItem -Path D:\TEP\FilesProcessing\Test\*.csv
您可以递归路径并使用提供程序过滤文件:
Get-ChildItem -Path D:\TEP\FilesProcessing\Test\ -recurse -include *.csv
这应该可以满足您的需求。
$Props = @{
Time = [datetime]::Parse($_.READ_DTTM)
Value = $_.{VALUE(KWH)}
Tag = $_.SUBSTATION,$_.CIRCUITNAME,$_.PHASE,$_.METERID,'KWH' -join "_"
}
$data = Get-ChildItem -Path D:\TEP\FilesProcessing\Test\*.csv | Foreach-Object {Import-CSV -Path $_.FullName}
$data | Select-Object -Property $Props | Export-CSv -NoTypeInformation D:\TEP\FilesProcessing\Test\file1_out.csv
使用Powershell时也要避免做以下事情:
$objs =@();
$objs += $Object;