ghostscript命令行中的可变数据

时间:2014-08-02 05:50:00

标签: variables command-line vbscript ghostscript

好的......我又来了。同一个项目。我试图遍历目录中的文件并在所有PDF上设置页面大小。我很难在参数中获取文件名,我需要通过ghostscript传递它们。我放弃了更改.run shell命令中的参数,并决定在变量中创建参数(如您所见)。我的问题似乎是在我传递的strParam变量中。当我在msgbox中检查它时它看起来是正确的但是当脚本运行时我没有创建任何文件。如果我硬编码我需要更改的2个参数(" -sOUTPUTFILE ="和文件名),它按预期工作。

Dim FSO, FLD, FIL, X
Dim strInput, strFolder, strParam

strInput = InputBox ("1 - Landscape" & chr(13) & "2 - Portrait", "Original Image   Orientation")
strFolder = InputBox ("Copy and paste the folder location" & chr(13) & "to your scans",  "File Location")
Set objShell = WScript.CreateObject("WScript.Shell")

If strInput=1 then  
    Call LandScape 
ElseIf strInput=2 Then
    Call Portrait
Else
    MsgBox "Your entry is invalid.  Click OK to exit"
End If


Sub LandScape
ObjShell.CurrentDirectory= strFolder
Wscript.Echo objShell.CurrentDirectory
    MsgBox "Your images are Landscape"
    MsgBox "Your files are located at: " & strFolder
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set FLD = FSO.GetFolder(strFolder)

    For Each FIL In FLD.Files
        strParam = chr(34) & " -dQUIET -dNOPAUSE dBATCH -dDEVICEWIDTHPOINTS=2592 -dDEVICEHEIGHTPOINTS=1728 -dFIXEDMEDIA -sDEVICE=pdfwrite -sOutputFile=new-" & FIL.Name & " " & FIL.Name & chr(34) & chr(34) & chr(34)
        MsgBox strParam
        objShell.Run """c:\Program Files\gs\gs9.04\bin\gswin64c.exe" & strParam
    Next

End Sub

2 个答案:

答案 0 :(得分:1)

由于你的问题是由.Run方法的参数引起的,你应该构建一个strCmd变量并显示它(而不仅仅是strParam)来排除最后的连接混乱。

如果你这样做,你可以复制&粘贴命令并从命令行测试它,而不是使用不同的命令进行检查(例如,在硬编码命令中没有-dDEVICEWIDTHPOINTS = 2592)。

由于我无法测试你的命令,我所能做的就是指出

末尾的3个引号
"c:\Program Files\gs\gs9.04\bin\gswin64c.exe" -dQUIET -dNOPAUSE dBATCH -dDEVICEWIDTHPOINTS=2592 -dDEVICEHEIGHT
POINTS=1728 -dFIXEDMEDIA -sDEVICE=pdfwrite -sOutputFile=new-04.vbs 04.vbs"""
看起来很腥。你想引用两个文件名吗?

您应该以结构化方式构建(复杂)命令行。有关背景信息,请参阅herehere(如果您不容易混淆)。

更新wrt @ Bond的答案:

对邦德以结构化方式构建命令行的方式不能有任何疑问。很健康。它适用于许多人和许多类似的任务就好了。但人们的联系方式不同,因此了解另一种方法可能需要付出代价:

Option Explicit
Function qq(s) : qq = """" & s & """" : End Function
Dim sFiNa : sFiNa = "justafile.ext"
Dim sCmd  : sCmd  = Join(Array( _
     qq("c:\Program Files\gs\gs9.04\bin\gswin64c.exe") _
   , "-dQUIET -dNOPAUSE dBATCH" _
   , "-dDEVICEWIDTHPOINTS=2592 -dDEVICEHEIGHTPOINTS=1728" _
   , "-dFIXEDMEDIA -sDEVICE=pdfwrite" _
   , "-sOutputFile=" & qq(sFiNa) _
   , qq(sFiNa) _
))
WScript.Echo sCmd

输出:

"c:\Program Files\gs\gs9.04\bin\gswin64c.exe" -dQUIET -dNOPAUSE dBATCH -dDEVICEWIDTHPOINTS=2592 -dDEVICEHEIGHTPOINTS=1728 -dFIXEDMEDIA -sDEVICE=pdfwrite -sOutputFile="justafile.ext" "justafile.ext"
  1. 报价实施一次;无需检查6次出现 Chr(34)要防范一个错字Chr(43)
  2. Join自动提供参数之间的空格;没有 需要检查每个&因为#34;我也需要一个空间吗?"。
  3. 因为构建了完整的命令行,所以可以对其进行测试;相比之下, strExe & " " & strParms的正确性(真的有空间吗? 引号之间或一些有趣的字母显示为空格 在我的编辑器里?我拼错了strParams(虽然不使用"选项 显然")?)可能仍有疑问。
  4. (4)测试可能会抛出错误,例如"输入和输出必须不同"。如果您没有额外的噪音(以及通过复制和粘贴编程的诱惑),这样的问题就更容易被发现,如

    strParams = strParams & Chr(34) & FIL.Name & Chr(34)
    strParams = strParams & " "
    !-- noise -----------------------!        !--------!
    strParams = strParams & Chr(34) & FIL.Name & Chr(34)
    

    VS

                     !----!     !
    , "-sOutputFile=" & qq(sFiNa) _
    

    此外,参数的含义在之前的3行语句中没有隐藏在列123ff中,并且它可以通过添加" -dNoErrorsPlease"来搞砸。争论后来。可能的解决方法

    , "-sOutputFile=" & qq("new-" & sFiNa) _
    

    看起来很复杂,但(对于VBScripter)显然意味着:"输出到文件,添加前缀' new - ',引用以避免文件名中的空格问题"。

答案 1 :(得分:1)

就像@Ekkehard提到的那样,你需要以结构化的方式构建它。查看原始命令行(VBScript之外)以及"使用Chr(34)的位置。然后在VBScript中使用正常的字符串连接将所有内容组合在一起。最好不要将双引号转义("")与Chr(34)混合使用。只需使用其中一个。为清楚起见,Chr(34)通常是最佳选择。

strParams = "-dQUIET -dNOPAUSE dBATCH -dDEVICEWIDTHPOINTS=2592 -dDEVICEHEIGHTPOINTS=1728 -dFIXEDMEDIA -sDEVICE=pdfwrite -sOutputFile=new-"
strParams = strParams & Chr(34) & FIL.Name & Chr(34)
strParams = strParams & " "
strParams = strParams & Chr(34) & FIL.Name & Chr(34)

strExe = Chr(34) & "c:\Program Files\gs\gs9.04\bin\gswin64c.exe" & Chr(34)

objShell.Run strExe & " " & strParams