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
答案 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"""
看起来很腥。你想引用两个文件名吗?
您应该以结构化方式构建(复杂)命令行。有关背景信息,请参阅here和here(如果您不容易混淆)。
更新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"
Chr(34)
要防范一个错字Chr(43)
。strExe & " " & strParms
的正确性(真的有空间吗?
引号之间或一些有趣的字母显示为空格
在我的编辑器里?我拼错了strParams(虽然不使用"选项
显然")?)可能仍有疑问。(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