none
コマンドラインのラッパーを作ろうとしています。 RRS feed

  • 質問

  • いつもお世話になります。
    VisualC#2010、WindowsXPでの動作について質問があります。
    http://support.microsoft.com/kb/305994/ja
    でコマンドラインのラッパーを作ろうとしています。

    ためしに、dirしてみようと、
    newProcess.StartInfo.FileName = @"C:\Windows\system32\cmd.exe";
    newProcess.StartInfo.Arguments = "dir";

    としたところ、

    C:\WINDOWS\twain_32>dir
     ドライブ C のボリューム ラベルがありません。
     ボリューム シリアル番号は DCAA-DCDC です

     C:\WINDOWS\twain_32 のディレクトリ

    2009/05/21  18:22    <DIR>          .
    2009/05/21  18:22    <DIR>          ..
    2008/04/14  21:00             3,584 wiatwain.ds
                   1 個のファイル               3,584 バイト
                   2 個のディレクトリ  30,134,657,024 バイトの空き領域

    C:\WINDOWS\twain_32>

    を期待していたのに、

    Microsoft Windows XP (Version 5.1.2600)
    (C) Copyright 1985-2001 Microsoft Corp.

    C:\Documents and Settings\username\My Documents\command\command\bin\Debug>

    が戻ってきました。
    dirってcmd.exeじゃないんでしたっけ?

    2011年1月31日 14:28

回答

  • コマンド プロンプトを開き、cmd /? と打ち込んでみてください。
    どのようにすれば、cmd にコマンドを処理させることができるか、オプション引数の説明があります。

    # 具体的には /C あたりの説明を読んでみてください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク d-kot 2011年2月1日 3:50
    2011年1月31日 15:03
    モデレータ
  • コマンドラインのプロセス実行をする場合、プロセスの標準入力にテキストを書きこむ

    という方法があります。

    // プロセス実行
    ProcessStartInfo psi = new ProcessStartInfo();
    psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
    psi.RedirectStandardInput = true;
    psi.RedirectStandardOutput = true;
    psi.UseShellExecute = false;
    psi.CreateNoWindow = true;
    Process prc = Process.Start(psi);
    prc.StandardInput.WriteLine("dir");
    prc.StandardInput.WriteLine("exit");
    // 実行結果
    MessageBox.Show(prc.StandardOutput.ReadToEnd());
    prc.WaitForExit();
    
    

    この場合、dirコマンドの後に連続してコマンドを書きこむ場合など、どこでコマンドが

    失敗したかを取得することが困難です。

    なので一連のコマンド処理をバッチファイルに書きこんで、実行後にファイルを削除

    する方法が簡単かもしれません。

    // バッチファイル作成
    Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
    File.WriteAllText("hoge.bat", "dir", sjisEnc);
    // プロセス実行
    ProcessStartInfo psi = new ProcessStartInfo();
    psi.FileName = "hoge.bat";
    psi.RedirectStandardInput = true;
    psi.RedirectStandardOutput = true;
    psi.UseShellExecute = false;
    psi.CreateNoWindow = true;
    Process prc = Process.Start(psi);
    // 実行結果
    MessageBox.Show(prc.StandardOutput.ReadToEnd());
    prc.WaitForExit();
    File.Delete("hoge.bat");
    
    

    • 回答としてマーク d-kot 2011年2月1日 3:50
    2011年2月1日 0:30

すべての返信

  • コマンド プロンプトを開き、cmd /? と打ち込んでみてください。
    どのようにすれば、cmd にコマンドを処理させることができるか、オプション引数の説明があります。

    # 具体的には /C あたりの説明を読んでみてください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク d-kot 2011年2月1日 3:50
    2011年1月31日 15:03
    モデレータ
  • コマンドラインのプロセス実行をする場合、プロセスの標準入力にテキストを書きこむ

    という方法があります。

    // プロセス実行
    ProcessStartInfo psi = new ProcessStartInfo();
    psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
    psi.RedirectStandardInput = true;
    psi.RedirectStandardOutput = true;
    psi.UseShellExecute = false;
    psi.CreateNoWindow = true;
    Process prc = Process.Start(psi);
    prc.StandardInput.WriteLine("dir");
    prc.StandardInput.WriteLine("exit");
    // 実行結果
    MessageBox.Show(prc.StandardOutput.ReadToEnd());
    prc.WaitForExit();
    
    

    この場合、dirコマンドの後に連続してコマンドを書きこむ場合など、どこでコマンドが

    失敗したかを取得することが困難です。

    なので一連のコマンド処理をバッチファイルに書きこんで、実行後にファイルを削除

    する方法が簡単かもしれません。

    // バッチファイル作成
    Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
    File.WriteAllText("hoge.bat", "dir", sjisEnc);
    // プロセス実行
    ProcessStartInfo psi = new ProcessStartInfo();
    psi.FileName = "hoge.bat";
    psi.RedirectStandardInput = true;
    psi.RedirectStandardOutput = true;
    psi.UseShellExecute = false;
    psi.CreateNoWindow = true;
    Process prc = Process.Start(psi);
    // 実行結果
    MessageBox.Show(prc.StandardOutput.ReadToEnd());
    prc.WaitForExit();
    File.Delete("hoge.bat");
    
    

    • 回答としてマーク d-kot 2011年2月1日 3:50
    2011年2月1日 0:30
  • Azuleanさん、コメントありがとうございます。
    なるほど。

    honefaiさん、ありがとうございました。
    これ、exitも表示されるのですが、
     process.StandardInput.WriteLine("exit");
    の行をコメントアウトすると実行が止まるんですね。

    バッチファイルもなるほど、目からうろこが落ちました。

    2011年2月1日 3:50