none
Powershell. печать файлов .PDF с помощью комманды start-procces . RRS feed

  • Вопрос

  • Всем доброго дня .

    Есть скрипт для распечатки Invoices (  файлов .pdf) из определенной папки . Условием для распечатки являтся нахождение номера Invoice

    в колонке  листа Excel.  Я пытаюсь создать  PSCustomobject. и при его помощи решить задачу. Вот скрипт:

    $ex = New-Object -ComObject Excel.Application
    $ex.Visible = 1
    #$wb = $ex.Workbooks.Open("C:\users\dov143\Documents\Template.xlsx")
    $wb = $ex.Workbooks.Open("C:\users\dov143\Documents\Invoices-list.xlsx")
    $ws = $wb.Worksheets.Item(1)
    
    
    $result = @()
    
    [int]$rmax = $ws.Range("G65536").End(-4162).Row
    $ws.Range("G2:G$rmax") | Where {$_.Value2} | Foreach {
        $col = $_.Column+1
        $row = $_.Row
        $val = $ws.Cells.Item($row,$col)
        $FilePath = "s:\INVOICES\0070\"
        
        $result += [pscustomobject]@{
            Invoices = [System.Convert]::ToString($_.Value2)
    
         Pdf = [System.Convert]::ToString($_.Value2)+".pdf"
     
        }
    $result+= $Object
    }
    
    $result | select pdf |Start-Process -FilePath "s:\INVOICES\0070\$($_.Invoices).pdf" –Verb Print
    $ex.Quit()
    
                      
    
    
     Я получаю следующую ошибку:
    start-Process : This command cannot be run due to the error: The system cannot find the file specified.
    At C:\PowerShell\Scripts\Invoices-list-pdf.ps1:29 char:23
    + $result | select pdf |start-Process -FilePath "s:\INVOICES\0070\$($_.Invoices).p ...
    +                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationException
        + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand

     



    когда я пробую вывод на консоль :

    $result | select pdf  
    то получаю правильный список  Invoices.

    Типа:

    11.pdf

    18.pdf

    76.pdf

    Заранее благодарен за помощь

    13 августа 2014 г. 12:01

Все ответы

  • Заменить строку на:

    $result | Foreach {Start-Process -FilePath "s:\INVOICES\0070\$($_.pdf)" –Verb Print}


    • Изменено KazunEditor 13 августа 2014 г. 12:12
    13 августа 2014 г. 12:09
    Отвечающий
  • Это немного другой скрипт, чем тот, что на прошлой неделе Вы мне помогли сделать

    После вашей комманды получаю ту же ошибку:

    Start-Process : This command cannot be run due to the error: The system cannot find the file specified.
    At C:\PowerShell\Scripts\Invoices-list-pdf.ps1:27 char:20
    + $result | Foreach {Start-Process -FilePath "s:\INVOICES\0070\$($_.pdf).pdf" –Ver ...
    +                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [Start-Process], InvalidOperationException
        + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommand
     
    

    13 августа 2014 г. 12:22
  • В вашей команде $($_.pdf).pdf,должно быть $($_.pdf)

    $result | Foreach {Start-Process -FilePath "s:\INVOICES\0070\$($_.pdf)" –Verb Print}

    13 августа 2014 г. 13:00
    Отвечающий
  • kazun

    вы как всегда на высоте, спасибо  все печатается, кроме двух раз (файлов ) когда выдается та же ошибка.

    еще хотелось бы, чтобы Invoices печатались в возрастающем порядке их номеров в Excel

    13 августа 2014 г. 13:16
  • Для начала проверить, что сортируется в возрастающем порядке:

    $result | Sort {[int]$_.Invoices}

    Если результат правильный,то:

    $result | Sort {[int]$_.Invoices} | Foreach {Start-Process -FilePath "s:\INVOICES\0070\$($_.pdf)" –Verb Print}
    С двумя файлами, проверить правильность имени, сравнив результат в переменной $result и в папке.

    13 августа 2014 г. 14:25
    Отвечающий
  • kazun

    $result | Sort {[int]$_.Invoices}

    работает правильно

    $result | Sort {[int]$_.Invoices} | Foreach {Start-Process -FilePath "s:\INVOICES\0070\$($_.pdf)}" Verb Print

    результат не правильный

    13 августа 2014 г. 14:47
  • В чем конкретно неправильно? Сортирует или распечатывает не в том порядке? Если сортирует, то привести сюда вывод с текущем результатом и требуемым из переменной $result.
    13 августа 2014 г. 15:20
    Отвечающий
  • Kazun

    Я думаю что нашел источник проблемы:

    при печати файлов pdf я выяснил что печатаются не все файлы

    номера которых находятся в Excel, так как эти файлы отсутствуют в данной папке. Это мешает командлету Sort-Object решить нашу проблему Когда я убрал номера несуществующих файлов, все работает.

    Я понимаю что требуется условный оператор, который выдает с одной стороны сообщение об ошибке, а с другой стороны

    позволяет печатать файлы находящиеся в данной папке. я не совсем понимаю где я его должен вставить (может быть в

    конвеере ?) .

    Если это возможно я хотел бы открыть новую триаду с той же задачей, но  используя файл .csv , полученный после автоматического преобразования нашего Excel файла.  Скрипт будет запускаться не компе с Powershell v2. так как по опредеделенным причинам нет возможности повысить версию.

    .

    14 августа 2014 г. 7:37
  • Прикрепите csv файл.

    14 августа 2014 г. 7:54
    Отвечающий
  • kazunList-invoices.csv

    я хотел бы получить ответ на текущий вопрос.

    Насчет вопроса о .csv

    я прикрепляю файл
    14 августа 2014 г. 8:44
  • kazunList-invoices.csv

    я хотел бы получить ответ на текущий вопрос.

    Насчет вопроса о .csv

    я прикрепляю файл

    Файл csv скачать нельзя. Выложить его на - http://webfile.ru/ .
    14 августа 2014 г. 9:01
    Отвечающий
  • Kazun






    G
     



    Invoice
     



     
     



    1125
     



    1188
     



    2625
     



    2629
     



    3114
     



    4511

    14 августа 2014 г. 11:00
  • Kazun






    G
     



    Invoice
     



     
     



    1125
     



    1188
     



    2625
     



    2629
     



    3114
     



    4511


    И где тут собственно csv файл? Вижу набор цифр, вижу gif, но csv -  нет и не было.
    14 августа 2014 г. 11:38
    Отвечающий
  • http://webfile.ru/a40b308246b2b4549b69cbe6334dd3a1
    17 августа 2014 г. 5:13
  • kazun

    я извиняюсь за долгое молчание молчание, вот ссылка на файл

    http://webfile.ru/a40b308246b2b4549b69cbe6334dd3a1

    17 августа 2014 г. 5:34
  • Import-Csv invoices-list.csv -Header H1,H2,H3,H4,H5,H6,Invoice | Where {$_.Invoice -as [int]} | Sort Invoice | Foreach {
    	$p = "s:\INVOICES\0070\$($_.Invoice).pdf"
    	if(Test-Path $p) {
    		Start-Process -FilePath $p –Verb Print
    	}
    	else {
    		Write-Host "$p не найден" -ForegroundColor Yellow
    	}
    }

    17 августа 2014 г. 8:46
    Отвечающий
  • kazun

    я не совсем понимаю конструкцию

     -Header H1,H2,H3,H4,H5,H6,Invoice

    а если заранее неизвестно количество строк

    17 августа 2014 г. 9:27
  • Кол-во строк изначально известно, т.к. файл уже есть и посчитать довольо легко.

    ,,,,,,Invoice,,,,,,,, = H1,H2,H3,H4,H5,H6,Invoice,H7,H8,H9,H10,H11,H12,H13,H14

    17 августа 2014 г. 11:09
    Отвечающий
  • kazun

    конечный пользователь не хочет счтитать сколько строк есть в таблице.

    он хочет нажать на "кнопку" и получить распечатанные  документы или сообщение, что определенных файлов

    нет в данной папке.

    Кроме того, я упоминал , что у пользователей установлена powershell v2 ( из поставки Windows 7), в которой командлет

    Import-Csv работает по другому

      и на сей день "есть мнение", что ничего менять не надо. работает - не трогай.

    Я очень извиняюсь, но осталась не решенной проблема сортировки в аналогичной задаче из Excel, в случае отсутсвия

    файлов pdf , соответствующих определенным строкам столбца.

    Еще раз благодарен за проявленное внимание.

    17 августа 2014 г. 11:43
  • $ex = New-Object -ComObject Excel.Application
    $ex.Visible = 1
    $wb = $ex.Workbooks.Open("C:\users\dov143\Documents\Invoices-list.xlsx")
    $ws = $wb.Worksheets.Item(1)
    $FilePath = "s:\INVOICES\0070\"
    $result = 
    
    [int]$rmax = $ws.Range("G65536").End(-4162).Row
    
    $result=$ws.Range("G2:G$rmax") | Where {$_.Value2} | Foreach {
        
        	[pscustomobject]@{
            	Invoices = $($val=[System.Convert]::ToString($_.Value2);$val)
    		Pdf = $val+".pdf"}| where{test-path $_.pdf}
    
    }
    
    $result  | foreach {Start-Process -FilePath ($FilePath+$_.pdf) –Verb Print}
    $ex.Quit()

    2 сентября 2014 г. 18:37