Запуск аргументов командной строки - PullRequest
0 голосов
/ 23 августа 2011

Я пытаюсь запустить аргумент командной строки через VB.NET с помощью команды Shell ().

Я пытаюсь использовать этот фрагмент кода:

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 () с помощью Shell(StringName), но я все еще получаю ту же ошибку в строке.

Как я могу исправить эту проблему?

Ответы [ 3 ]

2 голосов
/ 23 августа 2011

Это неправильное использование метода Shell :

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

Параметры

PathName
Тип: System.String
Необходимые. Строка. Имя программы для выполнения, вместе с необходимыми аргументами и параметрами командной строки. PathName также может включать диск и путь к каталогу или папку.

Предполагается, что первым параметром будет имя программы для выполнения. FOR это не программа, это встроенная функция интерпретатора командной строки cmd.exe.

Насколько я вижу, у вас есть следующие опции:

Опция 1 : явно вызвать cmd.exe и передать строку, которую вы хотите выполнить, с параметром /c:

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

Запрещается дублировать кавычки ("), чтобы избежать их.

Опция 2 : создайте пакетный файл и вызовите пакетный файл, используя Shell.

Опция 3 : не используйте FOR, чтобы найти нужные файлы, но используйте методы пространства имен System.IO, например, Directory.EnumerateFiles , вместо.

1 голос
/ 23 августа 2011

Избегайте внутренних кавычек, как это.

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

Вы также можете использовать System.Diagnostics.Process вместо Shell

.
0 голосов
/ 23 августа 2011

Попробуйте экранировать кавычки (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 ")
...