none
Печать определенного списка файлов pdf находящихся в двух папках RRS feed

  • Вопрос

  • привет всем форумчанам!

    У меня есть работающий скрипт:

    $ex = New-Object -ComObject Excel.Application
    $ex.Visible = 1
    $wb = $ex.Workbooks.Open("C:\Users\meli\Desktop\Eli-column.xlsx")
    $ws = $wb.Worksheets.Item(1)
    
    $result = @()
    
    [int]$rmax = $ws.Range("G65536").End(-4162).Row
    $ws.Range("G1:G$rmax") | Where {$_.Value2} | Foreach {
    	$col = $_.Column+1
    	$row = $_.Row
    	$val = $ws.Cells.Item($row,$col)
    	
    	$result += [pscustomobject]@{
    		Invoices = $_.Value2
    		Values = $val.Value2
    	}
    }
    	
    $result | Where {!$_.Values} | Foreach {Start-Process -FilePath "s:\Invoices-SD-from-documentum\0070\$($_.Invoices).pdf" –Verb Print}
    $ex.Quit()
    Что мне нужно сделать чтобы поиск и печать файлов pdf производились не только в папке s:\Invoices-SD-from-documentum\0070\, но также

    и в, скажем, папке "s:\Old_invoices"

    заранее благодарен всем откликнувшим.


    nesher13

Ответы

  • Дабы вы не получали больших и красных ошибок резонно использовать какую то проверку на наличие файла

    Пример test-path проверяет есть ли файл в данном расположении, если есть печать, если нет вывод сообщения что такого файла нет

    я слегонца промахнулся эту проверку нужно делать несколько дальше

    попробуйте так

    $PathList | foreach { $path = $_
    $result | Where {!$_.Values} | Foreach { 
        if (test-path "$Path\$($_.Invoices).pdf"){Start-Process -FilePath "$Path\$($_.Invoices).pdf" –Verb Print}
        else {"$Path\$($_.Invoices).pdf not found"}
        }
    }
    вместо


    $PathList | foreach { $path = $_
    if (test-path "$Path\$($_.Invoices).pdf"){
    $result | Where {!$_.Values} | Foreach {Start-Process -FilePath "$Path\$($_.Invoices).pdf" –Verb Print}}
    else {"$Path\$($_.Invoices).pdf not found"}
    }


    • Предложено в качестве ответа Vector BCOModerator 14 мая 2015 г. 12:51
    • Помечено в качестве ответа KazunEditor 14 мая 2015 г. 13:58
    Модератор
  • $PathList = @("s:\Invoices-SD-from-documentum\0070";"s:\Invoices-SD-from-documentum\0071";"s:\Invoices-SD-from-documentum\0072")
    
    $ex = New-Object -ComObject Excel.Application
    $ex.Visible = 1
    $wb = $ex.Workbooks.Open("C:\Users\meli\Desktop\Eli-column.xlsx")
    $ws = $wb.Worksheets.Item(1)
    
    $result = @()
    
    [int]$rmax = $ws.Range("G65536").End(-4162).Row
    $ws.Range("G1:G$rmax") | Where {$_.Value2} | Foreach {
    	$col = $_.Column+1
    	$row = $_.Row
    	$val = $ws.Cells.Item($row,$col)
    	
    	$result += [pscustomobject]@{
    		Invoices = $_.Value2
    		Values = $val.Value2
    	}
    }
    $PathList | foreach { $path = $_
    if (test-path "$Path\$($_.Invoices).pdf"){
    $result | Where {!$_.Values} | Foreach {Start-Process -FilePath "$Path\$($_.Invoices).pdf" –Verb Print}}
    else {"$Path\$($_.Invoices).pdf not found"}
    }
    $ex.Quit()
    попробуйте как-то так

    • Изменено Vector BCOModerator 14 мая 2015 г. 11:17
    • Помечено в качестве ответа nesher13 17 мая 2015 г. 16:19
    Модератор
  • суть скрипта сводится к тому что мы заходим в первую директорию и пытаемся найти все файлы из списка

    те что находим печатаем, те что не находим пишем что такого файла в такой папке нет

    Далее заходим во вторую директорию и пытаемся проверить опять все файлы, те что находим печатаем в другом случае выводим сообщение о том что файла нет

    и тд.

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

    ИМХО такой вариант (как приведенный мной ранее) является более правильным

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

     else {"$Path\$($_.Invoices).pdf not found"}

    заменить на

    if (-not (test-path "$Path\$($_.Invoices).pdf")) {"In folder $Path file $($_.Invoices).pdf not found"}

    так же можно сделать вывод сообщения при печати, для этого нужно заменить

    {Start-Process -FilePath "$Path\$($_.Invoices).pdf" –Verb Print}

    на

    {"Start printing $Path\$($_.Invoices).pdf"
    Start-Process -FilePath "$Path\$($_.Invoices).pdf" –Verb Print}

    • Помечено в качестве ответа nesher13 17 мая 2015 г. 16:18
    Модератор
  • Function Print-PDF ($file){Start-Process -FilePath $file –Verb Print}
    
    $result | Where {!$_.Values} | Foreach { 
    $Filename = $($_.Invoices)
    $PathList | foreach {
        $path = $_
        $File = "$Path\$Filename.pdf"
        if (test-path $File){$Fileprint = $File}
        }
    if (test-path $Fileprint){Print-PDF -file $Fileprint}
    if (-not (test-path $Fileprint)){"File $Filename not found"}
    Clear-Variable Fileprint 
    }
    Попробуйте так
    • Изменено Vector BCOModerator 16 мая 2015 г. 21:43
    • Предложено в качестве ответа Vector BCOModerator 17 мая 2015 г. 15:55
    • Помечено в качестве ответа nesher13 17 мая 2015 г. 16:12
    Модератор

Все ответы

  • $result | Where {!$_.Values} | Foreach {Start-Process -FilePath "s:\Old_invoices\$($_.Invoices).pdf" –Verb Print}
    что делает скрипт? $result | Where {!$_.Values} это что?

    Модератор
  • Vector BCO

    спасибо за быстрое реагирование.

    но я имел ввиду не искать и печатать в каждой папке отдельно.

    скажем завтра, у меня будут 10 папок и что тогда?


    nesher13

  • поясните задачу, вообще не ясно что вам нужно
    Модератор
  • есть файл Excel, В одной из колонок которого находятся номера счетов-фактур.

    Есть файлы pdf , соответствующие этим номерам. которые находятся в разных папках. известных заранее. надо распечатать эти файлы


    nesher13

  • $PathList = @("s:\Invoices-SD-from-documentum\0070";"s:\Invoices-SD-from-documentum\0071";"s:\Invoices-SD-from-documentum\0072")
    
    $ex = New-Object -ComObject Excel.Application
    $ex.Visible = 1
    $wb = $ex.Workbooks.Open("C:\Users\meli\Desktop\Eli-column.xlsx")
    $ws = $wb.Worksheets.Item(1)
    
    $result = @()
    
    [int]$rmax = $ws.Range("G65536").End(-4162).Row
    $ws.Range("G1:G$rmax") | Where {$_.Value2} | Foreach {
    	$col = $_.Column+1
    	$row = $_.Row
    	$val = $ws.Cells.Item($row,$col)
    	
    	$result += [pscustomobject]@{
    		Invoices = $_.Value2
    		Values = $val.Value2
    	}
    }
    $PathList | foreach { $path = $_
    if (test-path "$Path\$($_.Invoices).pdf"){
    $result | Where {!$_.Values} | Foreach {Start-Process -FilePath "$Path\$($_.Invoices).pdf" –Verb Print}}
    else {"$Path\$($_.Invoices).pdf not found"}
    }
    $ex.Quit()
    попробуйте как-то так

    • Изменено Vector BCOModerator 14 мая 2015 г. 11:17
    • Помечено в качестве ответа nesher13 17 мая 2015 г. 16:19
    Модератор
  • в результате я получаю:

    s:\Invoices-SD-from-documentum\0070\.pdf not found
    s:\Invoices-Spool\.pdf not found
    так же мне не понятно что такое test-path в условии IF


    nesher13

  • Дабы вы не получали больших и красных ошибок резонно использовать какую то проверку на наличие файла

    Пример test-path проверяет есть ли файл в данном расположении, если есть печать, если нет вывод сообщения что такого файла нет

    я слегонца промахнулся эту проверку нужно делать несколько дальше

    попробуйте так

    $PathList | foreach { $path = $_
    $result | Where {!$_.Values} | Foreach { 
        if (test-path "$Path\$($_.Invoices).pdf"){Start-Process -FilePath "$Path\$($_.Invoices).pdf" –Verb Print}
        else {"$Path\$($_.Invoices).pdf not found"}
        }
    }
    вместо


    $PathList | foreach { $path = $_
    if (test-path "$Path\$($_.Invoices).pdf"){
    $result | Where {!$_.Values} | Foreach {Start-Process -FilePath "$Path\$($_.Invoices).pdf" –Verb Print}}
    else {"$Path\$($_.Invoices).pdf not found"}
    }


    • Предложено в качестве ответа Vector BCOModerator 14 мая 2015 г. 12:51
    • Помечено в качестве ответа KazunEditor 14 мая 2015 г. 13:58
    Модератор
  •  все печатает  но выдает:

    s:\Invoices-SD-from-documentum\0070\7132928.pdf not found
    s:\Invoices-Spool\9242046.pdf not found
    s:\Invoices-Spool\1142397.pdf not found
    s:\Invoices-Spool\9143663.pdf not found
    s:\Invoices-Spool\1543664.pdf not found


    nesher13

  • а эти файлы существуют?

    если файлов нет и такие сообщения вам видеть не интересно можете закомментировать

    # else {"$Path\$($_.Invoices).pdf not found"}
    или и вовсе удалить (в случае если эта строка будет закомментирована вы всегда сможете ее включить по надобности убрав #)


    Модератор
  • файлы существуют   и правильно распечатаютя

    nesher13

  • имеется в виду что есть файл в директории s:\Invoices-Spool\ с названием 1543664.pdf, или нет?

    покажите вывод команды 

    test-path "s:\Invoices-Spool\1543664.pdf"

    Модератор
  • все файлы существуют в той или иной папке

    PS C:\Users\meli> Test-Path "s:\Invoices-Spool\1543664.pdf"
    True

    PS C:\Users\meli>Test-Path "s:\Invoices-SD-from-documentum\0070\1543664.pdf"

    False


    nesher13

  • суть скрипта сводится к тому что мы заходим в первую директорию и пытаемся найти все файлы из списка

    те что находим печатаем, те что не находим пишем что такого файла в такой папке нет

    Далее заходим во вторую директорию и пытаемся проверить опять все файлы, те что находим печатаем в другом случае выводим сообщение о том что файла нет

    и тд.

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

    ИМХО такой вариант (как приведенный мной ранее) является более правильным

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

     else {"$Path\$($_.Invoices).pdf not found"}

    заменить на

    if (-not (test-path "$Path\$($_.Invoices).pdf")) {"In folder $Path file $($_.Invoices).pdf not found"}

    так же можно сделать вывод сообщения при печати, для этого нужно заменить

    {Start-Process -FilePath "$Path\$($_.Invoices).pdf" –Verb Print}

    на

    {"Start printing $Path\$($_.Invoices).pdf"
    Start-Process -FilePath "$Path\$($_.Invoices).pdf" –Verb Print}

    • Помечено в качестве ответа nesher13 17 мая 2015 г. 16:18
    Модератор
  • >Пожно делать по другому можно брать файл и искать где он есть, но в таком случае >упускается возможность того что файлы с одинаковыми названиями будут в двух и >более директориях

    меня бы устроил этот вариант, так как файл не может быть одновремменно в двух папках.  Это определенно постановкой задачи. мой промах, что не указал это в начале


    nesher13

  • Function Print-PDF ($file){Start-Process -FilePath $file –Verb Print}
    
    $result | Where {!$_.Values} | Foreach { 
    $Filename = $($_.Invoices)
    $PathList | foreach {
        $path = $_
        $File = "$Path\$Filename.pdf"
        if (test-path $File){$Fileprint = $File}
        }
    if (test-path $Fileprint){Print-PDF -file $Fileprint}
    if (-not (test-path $Fileprint)){"File $Filename not found"}
    Clear-Variable Fileprint 
    }
    Попробуйте так
    • Изменено Vector BCOModerator 16 мая 2015 г. 21:43
    • Предложено в качестве ответа Vector BCOModerator 17 мая 2015 г. 15:55
    • Помечено в качестве ответа nesher13 17 мая 2015 г. 16:12
    Модератор
  • Vector BCO<abbr class="affil"></abbr>

    По правде, говоря еще не разбирался с последним постом.

    но одно из предыдущих решений у меня заработало.

    большое вам спасибо.


    nesher13

  • Если что обращайтесь, было приятно помочь)

    Сейчас решаю схожую задачу :)

    Модератор