运行命令行参数

时间:2011-08-23 08:03:31

标签: vb.net shell command-line cmd

我正在尝试使用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()命令,但我仍然在字符串中得到相同的错误。

我该如何解决这个问题?

3 个答案:

答案 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 ")