Прежде всего, Get-ChildItem
возвращает объекты FileInfo и / или DirectoryInfo, поэтому я бы посоветовал добавить к нему переключатель -File
, чтобы вы знали, что имеете дело только с файлами.
Затем вы перебираете эти файлы и в этом l oop вы делаете что-то очень странное, а именно $File | ForEach-Object
. Переменная $File
здесь содержит один объект FileInfo, а не импортированные данные этого файла.
Вопрос не говорит о том, все ли файлы имеют столбец с именем result
, поэтому код должен проверить это и, наконец, помнить, что все, что вы импортируете из CSV, это строка . Для этого нужно преобразовать в тип данных цифр c. Код ниже использует простое приведение к [double]
для этого.
$SourcePath = "D:\CsvFiles"
$CsvFiles = Get-ChildItem -Path $SourcePath -Filter "*.csv" -File
$CsvFiles | ForEach-Object {
# create an output filepath. Since you are filtering on '*.csv', we can hardcode the extension here
$OutFile = Join-Path -Path $SourcePath -ChildPath ('{0}s.csv' -f $_.BaseName)
# so you know what file you are creating
Write-Host "Working on $OutFile" -ForegroundColor Yellow
# import the data from the file ($_) and calculate
Import-Csv -Path $_.FullName | ForEach-Object {
# since you're doing math, the values in A and B need to be converted from string to numeric type
$result = [Math]::Round([double]$_.A / [double]$_.B, 0)
# if the csv does not contain a column 'result', create it
if ($_.PSObject.Properties.Name -notcontains 'result') {
$_ | Add-Member -MemberType NoteProperty -Name 'result' -Value $result
}
else {
$_.result = $result
}
# Output the object (which contains A, B and result)
$_
} | Export-Csv -Path $OutFile -NoTypeInformation
}