У меня есть пакетный скрипт, который перемещается по папке и выравнивает 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 делает то, что он должен, но в конечном итоге я не создаю никакого файла ...
пс код выглядит хорошо. Может быть проблема с пробелом пути с аргументами exe (попробуйте без). –
$ GhostScript странно, не должно быть '$ ghostScript =" $ ($ env: ProgramFiles) \ gs \ gs9.07 \ bit \ gswin64c.exe "' –
'-sOutputFile =" $ OutputFile "" $ InputFile "' $ OutputFile имеет пробелы? Поэтому вам нужно процитировать его обратно ticks -sOutputFile = "" $ OutputFile "" $ InputFile' –