none
請問用C# 用cmd nbtstat命令 RRS feed

  • 問題

  • private void button1_Click(object sender, EventArgs e)
    {
    
    
    string[] cmd = { "nbtstat -A 111.184.124.90", "ping 111.184.124.90","exit" }; 
    richTextBox1.Text = (Cmd(cmd));
    
    
    
    }
    
    public static string Cmd(string[] cmd)
    {
    Process p = new Process();
    p.StartInfo.FileName = "cmd.exe";
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardInput = true;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.RedirectStandardError = true;
    p.StartInfo.CreateNoWindow = true;
    p.Start();
    p.StandardInput.AutoFlush = true;
    for (int i = 0; i < cmd.Length; i++)
    {
    p.StandardInput.WriteLine(cmd[i]);
    }
    string strRst = p.StandardOutput.ReadToEnd();
    p.WaitForExit();
    p.Close();
    return strRst;
    }
    }

    執行結果如下

    Microsoft Windows [版本 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation. All rights reserved.

    C:\Users\*\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug>nbtstat -A 111.184.124.90

    C:\Users\*\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug>ping 111.184.124.90

    Ping 111.184.124.90 (使用 32 位元組的資料):
    回覆自 111.184.124.90: 位元組=32 time<1ms TTL=128
    回覆自 111.184.124.90: 位元組=32 time<1ms TTL=128
    回覆自 111.184.124.90: 位元組=32 time<1ms TTL=128
    回覆自 111.184.124.90: 位元組=32 time<1ms TTL=128

    111.184.124.90 的 Ping 統計資料:
    封包: 已傳送 = 4,已收到 = 4, 已遺失 = 0 (0% 遺失),
    大約的來回時間 (毫秒):
    最小值 = 0ms,最大值 = 0ms,平均 = 0ms

    C:\Users\*\Desktop\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug>exit

    請問為什麼nbtstat命令結果沒跑出來?

    如果我filename=nbtstat,他會找不到檔案

    懇請大大指教



    • 已編輯 eggeggeg 2012年6月29日 下午 11:30
    2012年6月29日 下午 12:03

解答

  • 或許您能改用 Dns.GetHostEntry Method (IPAddress) 來取得您要的資訊哦!

    請問您的作業系統是什麼的呢? win7 x64嗎? 專案平台設定的是X86 or X64呢?

    請參考一下這個: 32 位元應用程式無法存取在執行 64 位元版的 Windows Server 2003 或 Windows xp 的電腦上的 [system32] 資料夾

    如果您的作業系統是x64,而您的專案平台設定成的是x86,那您的string[] cmd要先加一個@"path=%path%;%WinDir%\Sysnative"哦!

    您試一下cmd改成以下的方式看看結果是不是出來了呢?

    private void button1_Click(object sender, EventArgs e)
    {
    	string[] cmd = { @"path=%path%;%WinDir%\Sysnative", @"nbtstat -A 111.184.124.90", "ping 111.184.124.90","exit" };
    	
    	richTextBox1.Text = (Cmd(cmd));
    }
    
    public static string Cmd(string[] cmd)
    {
    	Process p = new Process();
    	p.StartInfo.FileName = @"cmd.exe";
    	p.StartInfo.UseShellExecute = false;
    	p.StartInfo.RedirectStandardInput = true;
    	p.StartInfo.RedirectStandardOutput = true;
    	p.StartInfo.RedirectStandardError = true;
    	p.StartInfo.CreateNoWindow = true;
    	p.Start();
    	p.StandardInput.AutoFlush = true;
    	for (int i = 0; i < cmd.Length; i++)
    	{
    		p.StandardInput.WriteLine(cmd[i]);
    	}
       
    	string strRst = p.StandardOutput.ReadToEnd();
    	strRst += Environment.NewLine +  p.StandardError.ReadToEnd();
    	p.WaitForExit();
    
    	p.Close();
    	return strRst;
    }


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/



    • 已編輯 亂馬客 2012年6月30日 上午 01:33
    • 已標示為解答 eggeggeg 2012年6月30日 上午 01:41
    2012年6月30日 上午 01:13

所有回覆

  • 您好,您可看一下p.StandardError.ReadToEnd()的結果,應該是有錯誤發生。

    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2012年6月29日 下午 03:30
  •  netstat  跟 -A 之間是否應該有個空白鍵?  

    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2012年6月29日 下午 04:10
  •  Process p = new Process();
                p.StartInfo.FileName = @"c:\windows\sysnative\nbtstat.exe";
                p.StartInfo.Arguments = "-a 192.168.1.1";
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.CreateNoWindow = true;
                p.Start();
                p.StandardInput.AutoFlush = true;
                string strRst = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
                p.Close();

    我改寫成這樣去測就會丟出結果了,不知道是不是你要的結果

    2012年6月29日 下午 05:59
  • to Alex_Lee

    您好,我有加空格,已修改

    • 已編輯 eggeggeg 2012年6月30日 上午 12:04
    2012年6月29日 下午 11:56
  • to kylin70

    您好,我的nbtstat路徑是在放@"c:\windows\system32\nbtstat.exe"

    所以我改成您的路徑沒錯誤也沒顯示東西出來

    但是當我改成@"c:\windows\system32\nbtstat.exe"

    他會跳出一個例外訊息說找不到檔案

    System.ComponentModel.Win32Exception (0x80004005): 系統找不到指定的檔案。

    懇請指教


    • 已編輯 eggeggeg 2012年6月30日 上午 12:06
    2012年6月30日 上午 12:02
    • 您好,您可看一下p.StandardError.ReadToEnd()的結果,應該是有錯誤發生。以上說明若有錯誤請指教,謝謝。
      亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

           您好

           無法評估運算式,因為原生框架在呼叫堆疊的最上層。

           我用偵錯執行,在這行

         string strRst = p.StandardOutput.ReadToEnd();

           他出現這個錯誤就停住了,不懂這個的意思 .. 懇請指教



    2012年6月30日 上午 12:09
  • 或許您能改用 Dns.GetHostEntry Method (IPAddress) 來取得您要的資訊哦!

    請問您的作業系統是什麼的呢? win7 x64嗎? 專案平台設定的是X86 or X64呢?

    請參考一下這個: 32 位元應用程式無法存取在執行 64 位元版的 Windows Server 2003 或 Windows xp 的電腦上的 [system32] 資料夾

    如果您的作業系統是x64,而您的專案平台設定成的是x86,那您的string[] cmd要先加一個@"path=%path%;%WinDir%\Sysnative"哦!

    您試一下cmd改成以下的方式看看結果是不是出來了呢?

    private void button1_Click(object sender, EventArgs e)
    {
    	string[] cmd = { @"path=%path%;%WinDir%\Sysnative", @"nbtstat -A 111.184.124.90", "ping 111.184.124.90","exit" };
    	
    	richTextBox1.Text = (Cmd(cmd));
    }
    
    public static string Cmd(string[] cmd)
    {
    	Process p = new Process();
    	p.StartInfo.FileName = @"cmd.exe";
    	p.StartInfo.UseShellExecute = false;
    	p.StartInfo.RedirectStandardInput = true;
    	p.StartInfo.RedirectStandardOutput = true;
    	p.StartInfo.RedirectStandardError = true;
    	p.StartInfo.CreateNoWindow = true;
    	p.Start();
    	p.StandardInput.AutoFlush = true;
    	for (int i = 0; i < cmd.Length; i++)
    	{
    		p.StandardInput.WriteLine(cmd[i]);
    	}
       
    	string strRst = p.StandardOutput.ReadToEnd();
    	strRst += Environment.NewLine +  p.StandardError.ReadToEnd();
    	p.WaitForExit();
    
    	p.Close();
    	return strRst;
    }


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/



    • 已編輯 亂馬客 2012年6月30日 上午 01:33
    • 已標示為解答 eggeggeg 2012年6月30日 上午 01:41
    2012年6月30日 上午 01:13
  • 或許您能改用 Dns.GetHostEntry Method (IPAddress) 來取得您要的資訊哦!

    請問您的作業系統是什麼的呢? win7 x64嗎? 專案平台設定的是X86 or X64呢?

    請參考一下這個: 32 位元應用程式無法存取在執行 64 位元版的 Windows Server 2003 或 Windows xp 的電腦上的 [system32] 資料夾

    如果您的作業系統是x64,而您的專案平台設定成的是x86,那您的string[] cmd要先加一個@"path=%path%;%WinDir%\Sysnative"哦!

    您試一下cmd改成以下的方式看看結果是不是出來了呢?

    private void button1_Click(object sender, EventArgs e)
    {
    	string[] cmd = { @"path=%path%;%WinDir%\Sysnative", @"nbtstat -A 111.184.124.90", "ping 111.184.124.90","exit" };
    	
    	richTextBox1.Text = (Cmd(cmd));
    }
    
    public static string Cmd(string[] cmd)
    {
    	Process p = new Process();
    	p.StartInfo.FileName = @"cmd.exe";
    	p.StartInfo.UseShellExecute = false;
    	p.StartInfo.RedirectStandardInput = true;
    	p.StartInfo.RedirectStandardOutput = true;
    	p.StartInfo.RedirectStandardError = true;
    	p.StartInfo.CreateNoWindow = true;
    	p.Start();
    	p.StandardInput.AutoFlush = true;
    	for (int i = 0; i < cmd.Length; i++)
    	{
    		p.StandardInput.WriteLine(cmd[i]);
    	}
       
    	string strRst = p.StandardOutput.ReadToEnd();
    	strRst += Environment.NewLine +  p.StandardError.ReadToEnd();
    	p.WaitForExit();
    
    	p.Close();
    	return strRst;
    }


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/



          謝謝亂馬客大大!!!

          疑惑這麼久的問題終於得到解答了,很開心:)

          也謝謝其他大大~~~

        

          


    • 已編輯 eggeggeg 2012年6月30日 上午 02:04
    2012年6月30日 上午 02:04
  • 執行環境是 w7 64bit vs2010

    public static string Cmd(string[] cmd)
            {
                Process p = new Process();
                p.StartInfo.FileName = @"c:\windows\sysnative\nbtstat.exe";
                p.StartInfo.Arguments = "-a 192.168.1.1";
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.CreateNoWindow = true;
                p.Start();
                p.StandardInput.AutoFlush = true;
                string strRst = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
                p.Close();
                return strRst;
            }

    執行環境 win7 xp mode  vs2008

    public static string Cmd()
            {
                Process p = new Process();
                p.StartInfo.FileName = @"C:\WINDOWS\system32\nbtstat.exe";
                p.StartInfo.Arguments = "-a 192.168.1.1";
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.CreateNoWindow = true;
                p.Start();
                p.StandardInput.AutoFlush = true;
                string strRst = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
                p.Close();
                return strRst;
            }

    在執行上都有顯示結果不知道你檔案名稱或是指令參誤有誤讓程式會找到這個執行檔

    2012年6月30日 上午 02:06
  • 執行環境是 w7 64bit vs2010

    public static string Cmd(string[] cmd)
            {
                Process p = new Process();
                p.StartInfo.FileName = @"c:\windows\sysnative\nbtstat.exe";
                p.StartInfo.Arguments = "-a 192.168.1.1";
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.CreateNoWindow = true;
                p.Start();
                p.StandardInput.AutoFlush = true;
                string strRst = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
                p.Close();
                return strRst;
            }

    執行環境 win7 xp mode  vs2008

    public static string Cmd()
            {
                Process p = new Process();
                p.StartInfo.FileName = @"C:\WINDOWS\system32\nbtstat.exe";
                p.StartInfo.Arguments = "-a 192.168.1.1";
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardInput = true;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardError = true;
                p.StartInfo.CreateNoWindow = true;
                p.Start();
                p.StandardInput.AutoFlush = true;
                string strRst = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
                p.Close();
                return strRst;
            }

    在執行上都有顯示結果不知道你檔案名稱或是指令參誤有誤讓程式會找到這個執行檔

    kylin70大大您好

    我把這段改成這樣就可以執行了

    string[] cmd = { @"path=%path%;%WinDir%\Sysnative", @"nbtstat -A 111.184.124.90", "ping 111.184.124.90","exit" };

    之後我又嘗試把專案平台目標建置成X64 (本來是X86)

    就不用加入PATH那段

    謝謝您們幫我解答問題^^

    2012年6月30日 上午 02:43