2011-08-23 13 views
0

Shell()コマンドを使用してVB.NETでコマンドライン引数を実行しようとしています。コマンドライン引数の実行

私は、コードのこの部分を使用しようとしている

:しかし、通訳は私にこのエラーを与えている

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

Character is not valid. (BC30037) 

のためにこれを使用して

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

%~部分。

また、Shell(StringName)を使用して文字列を作成し、その引数をShell()コマンドに渡しましたが、文字列に同じエラーが表示されます。

どうすればこの問題を解決できますか?

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

をpdf2swf.exeは、あなたのプログラムの実行ファイルが実行されている同じフォルダにない場合は、その可能性:(IIRC VB.NETで - - 「」2重引用符)

+0

あなたは内部引用符をエスケープする必要があります – Jodrell

+0

私はそれを試みましたが、その行にはまだプログラムがクラッシュします – Brian

+0

新しいエラーは何ですか? – Jodrell

答えて

0

引用符をエスケープしてみあなたがエラーを受けている理由になります。

また、実行可能ファイル以外の別のフォルダにある場合は、* .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:File not found.' – Brian

1

このように内部引用符をエスケープします。

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

VB.Netでは、ダブルクォーテーションマークを2倍にしてエスケープしています。

EDIT:

あなたがシェルの外に繰り返しを行う場合には役立つかもしれません。

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.

最初のパラメータが名前ことになっている:これはShell Methodの適切な使用ではありません

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 

(確かデバッグに)またShell

+0

私は試しましたが、プログラムはまだその行でクラッシュします – Brian

+0

それでは、新しいエラーは何ですか?少なくとも今はコンパイルされます。 – Jodrell

+0

'System.IO.FileNotFoundException:ファイルが見つかりませんでした。 ' – Brian

2

の代わりにSystem.Diagnostics.Processを使用してcosiderことができ実行するプログラムの名前。 FORはプログラムではありません。cmd.exeコマンドラインインタープリタの組み込み機能です。

私の知る限り見ることができるように、あなたは次のオプションがあります。

オプション1:明示的にcmd.exeを呼び出して、あなたが/cパラメータで実行したい文字列を渡す:

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

を引用符(")を重複してエスケープしないでください。

オプション2:バッチファイルを作成し、Shellを使用してバッチファイルを呼び出します。

オプション3FORを使用して、必要なファイルを検索するのではなく、System.IO名前空間のメソッドを使用します。代わりにDirectory.EnumerateFilesです。

+0

良い答え(特に明示的にcmd.exeを呼び出す部分)。うまくいけば、彼が再びログオンするとき、OPはあなたの答えを受け入れるだろう(そしてdeaccept mine)。 – Tim

関連する問題