2011-08-23 261 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