Я пытаюсь преобразовать файл Excel, содержащий несколько листов, в файлы CSV.
$currentDir = $PSScriptRoot
$csvPATH = Join-Path -Path $currentDir -ChildPath CSV_Files
New-Item -ItemType Directory -Force -Path $csvPATH | out-null
function Convert-ExcelSheetsToCsv {
param(
[Parameter(Mandatory, ValueFromPipelineByPropertyName)]
[ValidateNotNullOrEmpty()]
[Alias('FullName')]
[string]$Path,
[Parameter(Mandatory = $false, ValueFromPipeline, ValueFromPipelineByPropertyName)]
[bool]$AppendFileName
)
Begin {
$excel = New-Object -ComObject Excel.Application -Property @{
Visible = $false
DisplayAlerts = $false
}
}
Process {
$root = Split-Path -Path $Path
$filename = [System.IO.Path]::GetFileNameWithoutExtension($Path)
$workbook = $excel.Workbooks.Open($Path)
foreach ($worksheet in $workbook.Worksheets) {
if ($AppendFileName) {
$name = Join-Path -Path $csvPATH <# $root #> -ChildPath "${filename}_$($worksheet.Name).csv"
}
else {
$name = Join-Path -Path $csvPATH <# $root #> -ChildPath "$($worksheet.Name).csv"
}
try {
$worksheet.SaveAs($name, 6) #6 to ignore formatting and covert to pure text, otherwise, file could end up containing rubbish
} catch {
Write-Error -Message "Failed to save csv! Path: '$name'. $PSItem"
}
}
}
End {
$excel.Quit()
$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
}
}
Get-ChildItem -Path $currentDir -Filter *.xlsx 0 | Convert-ExcelSheetsToCsv
Это дает мне следующую ошибку:
Get-ChildItem: Невозможно найти позиционный параметр, который принимает аргумент '0'.
или если я поставлю 0 (для ложного) после как это: Get-ChildItem -Path $currentDir -Filter *.xlsx | Convert-ExcelSheetsToCsv 0
я получаю эту ошибку:
Convert-ExcelSheetsToCsv : The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the
input and its properties do not match any of the parameters that take pipeline input.
в основном, я пытаюсь выбрать вариант, если если $AppendFileName
ложно, тогда сгенерированные CSV-файлы будут именоваться только по имени листа, что является оператором else
$name = Join-Path -Path $csvPATH <# $root #> -ChildPath "$($worksheet.Name).csv"