[.NET]當x86專案在x64OS中遇見cmd.exe

[.NET]當x86專案在x64OS中遇見cmd.exe

朋友使用Process透過cmd.exe執行nbtstat指令,想要取得nbtstat指令的輸出結果,Code如下,


private void button1_Click(object sender, EventArgs e)
{
    string[] cmd = {  @"nbtstat -a 127.0.0.1", "ping 127.0.0.1", "exit" };
    MessageBox.Show(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;
}

 

 

結果卻沒有任何訊息輸出!

但是直接開啟cmd,輸入nbtstat -a 127.0.0.1卻又有訊息輸出?

image

 

覺得應該是有錯誤發生,於是在Code中加入讀取 StandardError 的訊息看看。


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;
}

 

果然是有錯訊發生 ( 'nbtstat' 不是內部或外部命令、可執行的程式或批次檔。 )。

image

 

後來看到「32 位元應用程式無法存取在執行 64 位元版的 Windows Server 2003 或 Windows xp 的電腦上的 [system32] 資料夾」這篇文章的說明,將專案平台改成AnyCPU,程式就可順利執行。

image

 

那如果專案一定要設成x86平台呢? 那就在下指令前,先加入 path=%path%;%WinDir%\Sysnative ,如下的Code,


private void button1_Click(object sender, EventArgs e)
{
    string[] cmd = { @"path=%path%;%WinDir%\Sysnative", @"nbtstat -a 127.0.0.1", "ping 127.0.0.1", "exit" };
    MessageBox.Show(Cmd(cmd));
}

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^