2013-03-19 4 views
0

У меня есть пакетный скрипт, который перемещается по папке и выравнивает PDF-файлы внутри него с помощью GhostScript (9.07). Я хочу преобразовать его в сценарий PowerShell, потому что он, похоже, время от времени разбивается, и я просто устал от отладки пакетных файлов.PowerShell и GhostScript

Во всяком случае, у меня есть сценарий PS, который, похоже, работает на основе его вывода в консоли, но на самом деле я не получаю никаких файлов. Ручная запись в PS, кажется, работает еще меньше ... Что я делаю неправильно?

Batch Script

@ECHO OFF 
:: 
:: Process all PDFs and flatten them to PDF/A format 
:: ===================================================================================== 
FOR %%F IN ("J:\Finals\*.pdf") DO (
    IF /I %%F NEQ "*Floor Plan*.pdf" (
::  Convert the original PDF to a flattened PDF PDF/A 
::  ======================================================================== 
     "%ProgramFiles%\gs\gs9.07\bin\gswin64.exe" -dPDFA -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="J:\Finals\%%~nF (Final).pdf" "%%F" 
:: 
::  Delete the original PDF file 
::  ======================================================================== 
     DEL "%%F" /F /Q 
:: 
::  Rename the flattened PDF PDF/A to the original PDF's name 
::  ======================================================================== 
     MOVE "J:\Finals\%%~nF (Final).pdf" "%%F" 
    ) 
) 
:: 
:: Move files form the Readdle drive to the Digital Documents drive 
:: ===================================================================================== 
ROBOCOPY J:\Finals\ K:\ *.* /MOV /R:0 /W:0 /MT 

PowerShell Script (до сих пор)

$GhostScript = "$env:ProgramFiles\gs\gs9.07\bin\gswin64c.exe" 

Get-ChildItem "C:\Test In\*.pdf" | Where { 
    $_.BaseName -NotMatch "Floor Plan" 
} | ForEach-Object { 
    $InputFile = $_.FullName 
    $OutputFile = "C:\Test Out\{0} (Final).pdf" -F $_.BaseName 

    & "$GhostScript" -dPDFA -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="$OutputFile" "$InputFile" 
} 

Вывод PowerShell Script

GPL Ghostscript 9.07 (2013-02-14) 
Copyright (C) 2012 Artifex Software, Inc. All rights reserved. 
This software comes with NO WARRANTY: see the file PUBLIC for details. 
Processing pages 1 through 1. 
Page 1 
Substituting font Times-Italic for TimesNewRomanPS-ItalicMT. 
Loading NimbusRomNo9L-ReguItal font from %rom%Resource/Font/NimbusRomNo9L-ReguItal... 4198200 2870566 3665244 2332637 3 done. 
Substituting font Courier for CourierNewPSMT. 
Loading NimbusMonL-Regu font from %rom%Resource/Font/NimbusMonL-Regu... 3755680 2306439 4089108 2566088 3 done. 
Loading NimbusRomNo9L-Regu font from %rom%Resource/Font/NimbusRomNo9L-Regu... 3796376 2391131 4078352 2484871 3 done. 
Loading Dingbats font from %rom%Resource/Font/Dingbats... 3917480 2509851 4280192 2689988 3 done. 

Для тех, кому это интересно, тестируется на виртуальной машине Windows Server 2008 R2. Он имеет 4 ГБ оперативной памяти и 4vCPU. Я также проверял, были ли проблемы с разрешениями с тестовыми папками, которые я использовал, и это было не так.

UPDATE

Я обновил свой пост, чтобы показать, что текущий сценарий выглядит следующим образом. Окружающая переменная $OutputFile в кавычках ничего не делает. Независимо от кавычек или нет, я всегда получаю вывод (который я добавил выше), который указывает, что GhostScript делает то, что он должен, но в конечном итоге я не создаю никакого файла ...

+0

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

+0

$ GhostScript странно, не должно быть '$ ghostScript =" $ ($ env: ProgramFiles) \ gs \ gs9.07 \ bit \ gswin64c.exe "' –

+0

'-sOutputFile =" $ OutputFile "" $ InputFile "' $ OutputFile имеет пробелы? Поэтому вам нужно процитировать его обратно ticks -sOutputFile = "" $ OutputFile "" $ InputFile' –

ответ

1

Ну, я выяснил решение. Это предполагает отказ от использования GhostScript для PDFtk. Серьезно, я не знаю, что такое сделка GhostScript, но она просто отказалась работать на 100%. Он работал как 95%, но последние 5%, о которых я действительно беспокоился (выведенный файл), никогда не происходили. Во всяком случае, я вместо этого использовал PDFtk, и он просто работает, и он также работает во много раз быстрее, чем GhostScript для одной и той же задачи. Я не понимаю ...

Вот что мой окончательный сценарий PowerShell выглядит следующим образом:

$PDFtk = "C:\Program Files (x86)\PDF Labs\PDFtk Server\bin\pdftk.exe" 

If (Test-Path $PDFtk) { 
    Get-ChildItem "J:\Finals\" | Where-Object { 
     $_.Extension -Match "pdf" 
    } | ForEach-Object { 
     $InputFile = $_.FullName 
     $OutputFile = "J:\Finals\{0} (Flattened).pdf" -F $_.BaseName 
     $DigitalDocumentsFile = "K:\{0}" -F $_.Name 

     & $PDFtk $InputFile OUTPUT $OutputFile FLATTEN 

     If (Test-Path $OutputFile) { 
      Remove-Item $InputFile 
      Move-Item $OutputFile $DigitalDocumentsFile 
     } 
    } 
} 
0

Ваша $OutFile переменная генерирует путь, который есть пробелы в нем, вам необходимо окружить его котировками:

& $GhostScript -dPDFA -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile="$OutputFile" $InputFile 
+0

Это не помогло. Я обновил сообщение с тем, что у меня есть для скрипта и вывода. – Gup3rSuR4c

0

Для меня, используя Pdftk произвел больше PDF, чем оригинал, так что не очень полезно. Я тоже хотел использовать powershell, потому что это просто путь в эти дни, но у меня тоже возникли проблемы с выполнением ghostscript в powershell. Поскольку он работал нормально при использовании пакетного файла, я решил запустить ghostscript с помощью командного файла с двумя параметрами, которые я вызываю в моем сценарии powershell.

урезанной (без зацикливания и очистки) выглядит следующим образом:

$script = "C:\path\to\script.cmd" 
$InputFile = "C:\path\to\input.pdf" 
$OutputFile = "C:\path\to\output.pdf" 
& $script $InputFile $OutputFile 

партия сценарий выглядит следующим образом:

echo off 
set arg1=%1 
set arg2=%2 

"C:\Program Files\gs\gs9.19\bin\gswin64c.exe" -sDEVICE=pdfwrite -dPDFSETTINGS=/screen -dCompatibilityLevel=1.4 -dNOPAUSE -dBATCH -sOutputFile=%arg2% %arg1%