none
關於新增路由一問 RRS feed

  • 問題

  • 請問一下

    我在winform,寫了一個方法,可以執行route add,如下片段程式碼,

    但在執行的時候,會閃一兩下cmd.exe的畫面,才會執行OK!!

    不知道有沒有方法可以讓呼叫執行這個方法時,不會閃那個cmd.exe的畫面,

    謝謝!!

    public static void Method(string command, string argument)
    {
                Process cmd = new Process();
                cmd.StartInfo.UserName = "test";
                cmd.StartInfo.Password = password;
                cmd.StartInfo.FileName = command;
                cmd.StartInfo.Arguments = argument;
                cmd.StartInfo.CreateNoWindow = true;
                cmd.StartInfo.UseShellExecute = false;
                cmd.Start();
                cmd.Close();
    }

    2013年4月15日 上午 05:06

解答

所有回覆

  • Hi,

    可以試試看利用ProccessStartIfo,並且指定WindowsStyle,可以參考下面連結資料

    http://msdn.microsoft.com/zh-tw/library/system.diagnostics.processstartinfo.windowstyle(v=vs.80).aspx


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守

    2013年4月15日 上午 06:46
  •  hi

     我有加入 cmd.WindowStyle = ProcessWindowStyle.Hidden;

     結果還是會閃cmd的畫面~

     另外我改用ProcessStartInfo,結果也還是一樣會閃cmd的畫面~

    2013年4月15日 上午 07:46
  • 我的bat檔案像是下面這樣

    ping 192.168.2.177 >>D:\123.txt

    然後測試程式碼是這樣

    private void button1_Click(object sender, EventArgs e)
            {
                Process cmd = new Process();
                cmd.StartInfo.FileName = @"D:\debug.bat";
                cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                //cmd.StartInfo.CreateNoWindow = true;
                //cmd.StartInfo.UseShellExecute = false;
                cmd.Start();
                cmd.Close();
            }

    我沒有看到閃一下的狀況哩


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守

    2013年4月15日 上午 08:01
  •  hi

     如果沒有加底下那兩行的話,是看不到會閃的畫面(我猜可能執行很快)

     但因需要加入指定帳號密碼執行,就會看到閃cmd.exe的畫面!!

     cmd.StartInfo.UserName = "test";
     cmd.StartInfo.Password = password;

    2013年4月15日 上午 09:11
  • Hi,

    我這邊是沒有測到依樣的狀況,還是你貼一下你bat的內容?我bat裡面用ping去測試,並且把回應寫到文字檔,會花上2秒左右的執行時間才是,加入帳號密碼的設定後也是沒有看到閃一下的狀況,測試的程式碼像是下面這樣

                cmd.StartInfo.FileName = @"D:\debug.bat";
                cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                cmd.StartInfo.UserName = "UserName";
                cmd.StartInfo.Password = pwd;
                cmd.StartInfo.CreateNoWindow = true;
                cmd.StartInfo.UseShellExecute = false;
                cmd.Start();
                cmd.Close();

    不知道跟你的差異是在哪個部分


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守

    2013年4月15日 上午 09:44
  •   hi

      我的程式碼大概是如下,執行新增一筆路由時, 這個我確定他執行的時候會閃一下!! 

    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Method("route", "add 10.0.0.0 mask 255.255.255.0 10.0.0.1");

                MessageBox.Show("OK!!");

            }

            public static void Method(string command, string argument)
            {
                Process cmd = new Process();
                cmd.StartInfo.UserName = "test";
                cmd.StartInfo.Password = password;
                cmd.StartInfo.FileName = command;
                cmd.StartInfo.Arguments = argument;
                cmd.StartInfo.CreateNoWindow = true;
                cmd.StartInfo.UseShellExecute = false;
                cmd.Start();
                cmd.Close();
            }

        }


    • 已編輯 Ericchang 2013年4月16日 上午 12:23
    2013年4月16日 上午 12:23
  • Hi,

    你的OS是使用XP嗎?可以確認一下有沒有上Service pack;我查了一下MSDN相關的資訊,在MSDN中有這一段說明(下面節錄部分原文)

    StartInfo 屬性中指定的參數,其變更次數為您在處理序上呼叫 Start 方法的次數。</sentencetext> StartInfo 值不會影響或重新啟動相關聯的處理序。</sentencetext> .UserName and ProcessStartInfo.Password properties set, the unmanaged CreateProcessWithLogonW function is called, which starts the process in a new window even if the CreateNoWindow property value is true or the WindowStyle property value is Hidden." id="mt22" style="background-color:#ffffe1;color:#2a2a2a;font-family:'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif;font-size:13px;" xml:space="preserve"><sentencetext xmlns="http://www.w3.org/1999/xhtml">如果您呼叫設定了 ProcessStartInfo.UserName 和 ProcessStartInfo.Password 屬性的 Start(ProcessStartInfo) 方法,則會呼叫 UnmanagedCreateProcessWithLogonW 函式,這會在新視窗中啟動處理序,即使 CreateNoWindow 屬性值為 true,或者 WindowStyle 屬性值為 Hidden</sentencetext>

    指定了UserName以及password之後,會呼叫CreateProcessWithLogonW這個API,然後在Support這篇,有提到該API會忽略startinfo.wShowWindows旗標,要上Hotfix,你可以看看執行環境如否跟上面提到的是一樣的狀況。

    以上參考看看了

    PS:有關Startinfo,使用上這篇也是很好的參考資訊,一起列出來參考


    請注意討論區相關規則,良好的討論環境需要大家共同努力、遵守


    • 已編輯 bauann 2013年4月16日 上午 01:36 增加reference
    2013年4月16日 上午 01:34
  •  

      Hi

      我的OS確實是XP,不過我已經更新到SP3了。

      我看了你提供的supports文章,理論上sp3應該已經包含這個hotfix,

      我下載了KB 818858的hotfix,安裝時他出現我的版本比他新,不需要更新的訊息!!

      不過你提供的資料大概有個方向,可能因指定了UserName以及password之後,

      會呼叫CreateProcessWithLogonW這個API,導致會閃那個cmd的畫面。

      雖然還沒解決這個問題,很感謝你的協助與提供不錯的資料,

      我會再從CreateProcessWithLogonW看看有沒有甚麼解決方法!!

    2013年4月16日 上午 03:57
  • Hi,

    同樣的程式在我的win8下跑也不會閃...

    你可以把cmd.close先拿掉看一下到底命令列有沒有隱藏的效果


    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/

    2013年4月16日 上午 05:11
  • Hi, Ericchang:

    請問這個問題目前解決的狀況如何呢 ? 別忘了回覆自己的問題喔.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年4月24日 上午 03:40
    版主
  • hi, bill 前輩

    目前我還找不到在XP下不會閃cmd.exe的方法,

    目前正參考網路上一篇文章:C# 通过Iphlpapi.dll API操作路由表

    http://malloctech.diandian.com/post/2012-07-10/40030748079

    目前還在學習中~~~

    2013年5月6日 上午 06:16