【问题标题】:Running Command Line Arguments运行命令行参数
【发布时间】:2011-08-23 08:03:31
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

  • 你需要转义你的内部引号
  • 我试过了,但程序仍然在那一行崩溃
  • @Jodrell System.IO.FileNotFoundException: File not found.
  • @Brian - 那是一个新错误,我认为这是不言自明的。
  • @Tim 是的,但是如果它是命令行参数,它需要什么文件?此外,pdf2sfw.exe 在文件夹中。

标签: vb.net shell command-line cmd


【解决方案1】:

这不是正确使用Shell Method

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

参数

路径名
类型:System.String
必需的。细绳。要执行的程序的名称,以及任何必需的参数和命令行开关。 PathName 还可以包括驱动器和目录路径或文件夹。

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

据我所知,您有以下选择:

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

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

不要让 get 重复引号 (") 来转义它们。

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

选项 3:不要使用FOR 来查找您需要的文件,而是使用 System.IO 命名空间的方法,例如Directory.EnumerateFiles,而不是。

【讨论】:

  • 很好的答案(尤其是关于显式调用 cmd.exe 的部分)。希望 OP 在再次登录时会接受您的回答(并拒绝我的回答)。
【解决方案2】:

像这样转义你的内部引号。

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

【讨论】:

  • 那么,新的错误是什么,或者甚至是问题?至少它现在可以编译了。
  • System.IO.FileNotFoundException: File not found.
  • @Brian,至少有一个您正在使用的文件未找到。
  • @Brian,而不是在 shell 中进行迭代(很难调试)为什么不在 VB 中获取文件名,然后在那里迭代 shell 调用?
  • 你能解释得更简单些吗?我正在尝试使用该命令行参数,因为基本上,它更容易(在我看来),因为它只获取文件夹中的所有 PDF 文件并将它们转换为 PDF,然后将它们重命名为原始名称。
【解决方案3】:

尝试转义引号(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 ")

【讨论】:

  • 不不,它只是在那条线上崩溃。 System.IO.FileNotFoundException: File not found.
猜你喜欢
  • 2017-06-16
  • 2014-06-23
  • 1970-01-01
  • 2023-04-06
  • 2016-03-25
  • 2014-05-29
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
相关资源
最近更新 更多