Как передать 2 значения из конвейера? - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь преобразовать файл 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"

1 Ответ

0 голосов
/ 28 апреля 2020

Позиция должна быть указана.

[Parameter(Mandatory, ValueFromPipelineByPropertyName,Position=1)] [Parameter(Mandatory=$false,ValueFromPipeline,ValueFromPipelineByPropertyName,Position=0)]

, а затем:

Get-ChildItem -Path $currentDir -Filter *.xlsx | Convert-ExcelSheetsToCsv 0
...