我正在尝试使用Shell()命令通过VB.NET运行命令行参数。
我正在尝试使用这段代码:
FOR /R %I in (*.pdf) DO @pdf2swf.exe "%~fI" -o "%~dpI%~nI.swf" -f -T 9
-t -G
使用此:
Shell("FOR /R %I in (*.pdf) DO @pdf2swf.exe "%~fI" -o "%~dpI%~nI.swf" -f -T 9
-t -G ")
但是,口译员给了我这个错误:
Character is not valid. (BC30037)
对于%~
部分。
我也尝试创建一个字符串并使用Shell(StringName)
将参数传递给Shell()命令,但我仍然在字符串中得到相同的错误。
我该如何解决这个问题?
答案 0 :(得分:2)
这不正确使用Shell Method:
Public Shared Function Shell (PathName As String, [...]) As Integer
<强>参数强>
的PathName
类型:System.String
需要。串。要执行的程序的名称,以及任何必需的参数和命令行开关。 PathName还可以包含驱动器和目录路径或文件夹。
第一个参数应该是要执行的程序的名称。 FOR
不是程序,它是cmd.exe
命令行解释器的内置功能。</ p>
据我所见,您有以下选择:
选项1 :显式调用cmd.exe
并使用/c
参数传递您要执行的字符串:
Shell("cmd.exe /c for /R %I ...")
不要复制引号("
)以逃避它们。
选项2 :创建批处理文件并使用Shell
调用批处理文件。
选项3 :不要使用FOR
来查找所需的文件,而是使用System.IO命名空间的方法,例如: Directory.EnumerateFiles,而不是。
答案 1 :(得分:1)
逃避这样的内部引号。
Shell("FOR /R %I in (*.pdf) DO @pdf2swf.exe ""%~fI"" -o ""%~dpI%~nI.swf"" -f -T 9 -t -G ")
我记得,在VB.Net中,你通过将它们加倍来逃避双引号。
编辑:
如果您在Shell之外进行迭代,这可能会有所帮助。 (当然要调试)
Dim sourceFolder As String = "c:\Your call"
Dim sourceFiles As String[] = Directory.GetFiles(sourceFolder, "*.pdf")
ForEach file As String In sourceFiles
Dim justName As String = Path.GetFileNameWithoutExtension(file)
Dim shellCall As String = _
String.Format("pdf2swf.exe ""{0}"" -o ""{1}.swf"" -f -T 9 -t -G", _
file, justName)
Shell(shellCall)
EndFor
您还可以使用System.Diagnostics.Process
代替Shell
答案 2 :(得分:0)
尝试转义引号(2引号 - “” - 在VB.NET,IIRC中):
Shell("FOR /R %I in (*.pdf) DO @pdf2swf.exe ""%~fI"" -o ""%~dpI%~nI.swf"" -f -T 9 -t -G ")
如果pdf2swf.exe不在程序可执行文件所在的同一文件夹中,则可能是您收到错误的原因。
此外,如果* .pdf文件位于可执行文件以外的其他文件夹中,则会遇到同样的问题。您可以指定要搜索的驱动器和路径:
Shell ("FOR /R C:\SomeFolder %I in (*.pdf) DO @pdf2swf.exe ""%~fI"" -o ""%~dpI%~nI.swf"" -f -T 9 -t -G ")