Powershell: ForEach объединяет все найденные значения в один, и сценарий не выполняется - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь создать скрипт, который будет обнаруживать все файлы XLSX в C: \ Temp \ ConversionCSV \ и конвертировать их в CSV. Он прекрасно работает, когда в папке только один файл.

Однако, когда есть 2 файла, ForEach «объединяет» оба значения FullName в один, прежде чем пытаться преобразовать xlsx в csv (очевидно, именно так это и работает). ). Это приводит к сбою преобразования. Я также попробовал ForEach-Object.

Есть ли способ заставить скрипт запускаться на каждом элементе без предварительной группировки их? Или альтернатива? Могу ли я просто изменить расширение (это кажется неправильным)?

PS: я больше не могу найти источник оригинального скрипта, поэтому не могу отдать должное автору.

SCRIPT:

cls
 Try {
      $Directory = "C:\temp\ConversionCSV\" 

      $ExcelFiles = (Get-ChildItem $Directory | Where Extension -Like .XLS* `
                                              | Select Name `
                                              | Format-Table -HideTableHeaders `
                                              | Out-String -ErrorAction Stop `
                                              ).trim() 


        #Files successfully detected:
        #C:\temp\ConversionCSV\copy.xlsx           
        #C:\temp\ConversionCSV\FinancialSample.xlsx


     Get-ChildItem $Repertoire | Select Name, Extension,  `
                                        BaseName, FullName, `
                                        Directory, DirectoryName `
                               | Where Extension -eq .XLSX `
                               | Out-String


      ForEach  ($ExcelFile in $ExcelFiles) 

              {
                   $xlCSV               = 6  
                   $Excel               = New-Object -comobject Excel.Application 
                   $Excel.Visible       = $False
                   $Excel.displayalerts = $False
                   ##############################################################################

                   $FullName =  $Directory+(Get-Variable -scope Local `
                                           | Where Name -EQ 'ExcelFile' `
                                           | Select Value `
                                           | Format-table -HideTableHeaders -AutoSize -Wrap `
                                           | Out-String -ErrorAction Stop).Trim()

                   Write-Host " `$FullName is $FullName"

                   ##############################################################################

                   $CSVfilename = ($FullName -Replace "XLSX", "CSV").Trim()

                   ##############################################################################

                   $Workbook = $Excel.Workbooks.Open($FullName) 
                   $Workbook.SaveAs($CSVfilename,$xlCSV) 

                   ##############################################################################

                   $NewCSV=   Get-ChildItem $Directory | Select Name, Extension, ` 
                                                                BaseName, FullName, `
                                                                Directory,  DirectoryName `
                                                       | Where  Extension -eq .CSV `
                                                       | Out-String -ErrorAction Stop

                   ##############################################################################

                   #regionCloseExcel

                  $Excel.Quit()

                   If     (Get-Process Excel)

                          {Write-Host "Closing Excel" 
                           Stop-Process -Name Excel} 

                   ElseIf (!(Get-Process Excel))

                          {Write-Host "`n Excel not runnning."}

                   Else   {Write-Host "`n Unexpected event."}

                   #endregionCloseExcel

                 }

      }


 Catch   {
          Write-Host "`n---------------------ERROR--------------`n"
          $_.Exception
          }


 Finally {Write-Host "`n----------------------END---------------"}

1 Ответ

0 голосов
/ 24 октября 2019

Мне трудно понять, почему вам нужно вызвать Get-ChildItem $Repertoire, и у меня так много кода, чтобы сгенерировать $FullName файла Excel.

Вот упрощенная версия вашего кодачто работает:

Try {
  $Directory = "C:\temp\"

  $ExcelFiles = (Get-ChildItem $Directory | Where Extension -Like ".XLS*")

  ForEach  ($ExcelFile in $ExcelFiles) {

       # grab the FullName here -> no need to parse
       $FullName = $ExcelFile.FullName

       $xlCSV               = 6  
       $Excel               = New-Object -comobject Excel.Application 
       $Excel.Visible       = $False
       $Excel.displayalerts = $False

       ##############################################################################              

       Write-Host " `$FullName is $FullName"

       ##############################################################################

       $CSVfilename = ($FullName -Replace "XLSX", "CSV").Trim()

       ##############################################################################

       $Workbook = $Excel.Workbooks.Open($FullName) 
       $Workbook.SaveAs($CSVfilename,$xlCSV) 

       ##############################################################################

       $Excel.Quit()

       If     (Get-Process Excel)

              {Write-Host "Closing Excel" 
               Stop-Process -Name Excel} 


       ElseIf (!(Get-Process Excel))

              {Write-Host "`n Excel not runnning."}


       Else   {Write-Host "`n Unexpected event."}

       #endregionCloseExcel

     }
}
Catch { Write-Host "n---------------------ERROR--------------n" $_.Exception }
Finally {Write-Host "`n----------------------END---------------"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...