2012-02-08 18 views
0

私はcmdでC#を使用してコマンドを実行しようとしていますが、いくつかの問題があります。私はそれが実行しようとしていることを見ることができるようにコマンドコンソールにコマンドを書くことができるようにしたいと思います(私は引用符など何か問題があると思うので、コマンドラインで実際の文字列を見ることができます問題が何であるかを正確に見ることができる)。私のコードは次のようになります:cmdコンソールでコマンドを表示

var processStartInfo = new ProcessStartInfo("cmd", "/c"+commandString); 
processStartInfo.CreateNoWindow = true; 
Process.Start(processStartInfo); 

基本的に、私はちょうどコンソールに書かれた文字列commandStringを見たいと思います。どんな助けも大いに大いに評価されるでしょう。

string CommandLineString = @"""C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe"" ""SELECT * FROM table where date >= '2009-01-01'"" queryout ""C:\Data\data.dat"" -S DBSW0323 -d CMS -n -T"; 

答えて

2

この場合、「/ c」の後ろにスペースがない可能性があります。コマンドウィンドウに表示するためのよう

var processStartInfo = new ProcessStartInfo("cmd", "/c " + commandString); 

、代わりに、あなたはおそらく、あなたのprocessStartInfoインスタンスのArgumentsプロパティを検査したほうが良いでしょう。コマンドラインを使用すると、投稿の詳細を考慮に入れると

EDIT

、私はこれがあなたの問題が何であるかであると考えています。

If /C or /K is specified, then the remainder of the command line after the switch is processed as a command line, where the following logic is used to process quote (") characters:

  1. If all of the following conditions are met, then quote characters on the command line are preserved:

    • no /S switch
    • exactly two quote characters
    • no special characters between the two quote characters, where special is one of: &<>()@^|
    • there are one or more whitespace characters between the the two quote characters
    • the string between the two quote characters is the name of an executable file.

あなたは/ cを使用しているので、引用符と特殊文字の問題は解決されています。 commandString全体を複数の引用符で囲みます。

例えば、この単純な例(手動でのコースTEMP.TXT作成)を取る:/c "C:\WINDOWS\Notepad.exe" "C:\temp.txt"、これはC」ため失敗します:実行するコマンドラインはなり

string commandString = @"""C:\WINDOWS\Notepad.exe"" ""C:\temp.txt"""; 
var processStartInfo = new ProcessStartInfo("cmd", "/c " + commandString); 

を\ TEMP.TXT "は実行可能ファイルではありません。

string commandString = @"""""C:\WINDOWS\Notepad.exe"" ""C:\temp.txt"""""; 
var processStartInfo = new ProcessStartInfo("cmd", "/c " + commandString); 

のコマンドラインに結果として得られる:/c ""C:\WINDOWS\Notepad.exe" "C:\temp.txt""、最終的にあなたのテストファイルをメモ帳を開いて、あなたが引用符の最後のセットで全体を包む場合

は、あなたが意図した結果が表示されるはずです。

+0

これは実際問題ですが、残念ながらまだ動作していません。 – sooprise

+0

コマンドとargを使用していることについて、より多くの情報を与えることができますか?コマンドラインのテストとアプリケーションのテストで異なるコマンドを実行した場合のベースディレクトリに問題がありますか? –

+0

@sooprise:エスケープ文字に問題がある場合は、 '' C:\\ sumptin ''の代わりに '@" C:\ sumptin "のように文字列を' @ 'で始めることを検討してください。 –

0

この文字列はコンソールに書き込まれません。起動するプログラムの引数リストの一部です(この場合はcmd.exeになります)。作成されたコンソールはそのプログラムが所有しているので、独自の理由で引数を表示しない限り(これはできません)、これは直接実行できません。

単にデバッグしたい場合は、commandStringの値を調べたり、ログファイルに書き込んだりするのはなぜですか?

あなたは絶対にコンソールに表示されるコマンドラインを必要とするならば、あなたはハックに頼ることができ(それと通話cmd.exeをコマンドラインとを印刷し、別の中間プログラムを実行する)が、いくつかの他の良いがある場合を除きこのアプローチを使用する理由は私はそれをお勧めしません。

+0

Jon、多分私のアプローチについてのフィードバックを私に与えることができます。私はcommandStringを取って、すべてのエスケープ文字を取り除き、cmdで直接コマンドを実行すると問題なく動作しますが、C#から次のエラーが表示されます。ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません。コマンドの唯一の違いはエスケープ文字なので、私はここで何か間違っていると感じます。それを修正する最善の方法が何であるかはわかりません。 – sooprise

+0

@sooprise:最初に、スペースの問題がないかどうか確認してください。 – Jon

+0

Jon、私はすでにそれを試みました、それはまだ動作していません – sooprise

関連する問題