2011-08-23 218 views
0

我试图运行使用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)创建一个字符串并传递参数给壳牌()命令,但我仍然得到同样的错误的字符串中。

我该如何解决这个问题?

+0

你需要逃避你的内部引号 – Jodrell

+0

我试过了,但程序仍然在那条线上崩溃 – Brian

+0

最新的错误是什么? – Jodrell

回答

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 ") 
+0

我试过了,但该程序仍然在该行崩溃 – Brian

+0

@Brian - 与同样的错误? – Tim

+0

不,不,它只是在这条线上崩溃。 'System.IO.FileNotFoundException:未找到文件.' – Brian

1

将您的内部引号标记为这样。

Shell("FOR /R %I in (*.pdf) DO @pdf2swf.exe ""%~fI"" -o ""%~dpI%~nI.swf"" -f -T 9 -t -G ") 

我记得,在VB.Net中,您通过加倍双引号来避免双引号。

编辑:

如果你做迭代壳牌之外这可能会有帮助。 (当然,调试)

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 

你也可以cosider使用System.Diagnostics.Process代替Shell

+0

我试过了,但该程序仍在该行上崩溃 – Brian

+0

那么,最新的错误,甚至是问题呢?至少现在编译。 – Jodrell

+0

'System.IO.FileNotFoundException:File not found.' – Brian

2

这不是正确使用Shell Method的:

Public Shared Function Shell (PathName As String, [...]) As Integer

Parameters

PathName
Type: System.String
Required. String. Name of the program to execute, together with any required arguments and command-line switches. PathName can also include the drive and the directory path or folder.

的第一个参数应该是名称要执行的程序。 FOR不是一个程序,它的cmd.exe命令行解释器的内置功能。

据我所看到的,你有以下几种选择:

选项1:显式调用cmd.exe并传递要与/c参数执行字符串:

Shell("cmd.exe /c for /R %I ...") 

不要拿重复的引号(")来逃避它们。

选项2:创建批处理文件并使用Shell调用批处理文件。

选项3:请勿使用FOR来查找所需的文件,而是使用System.IO命名空间的方法,例如,改为Directory.EnumerateFiles

+0

很好的答案(特别是关于明确调用cmd.exe的部分)。希望OP会在他再次登录时接受你的回答(并拒绝我的回答)。 – Tim