[.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卻又有訊息輸出?
覺得應該是有錯誤發生,於是在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' 不是內部或外部命令、可執行的程式或批次檔。 )。
後來看到「32 位元應用程式無法存取在執行 64 位元版的 Windows Server 2003 或 Windows xp 的電腦上的 [system32] 資料夾」這篇文章的說明,將專案平台改成AnyCPU,程式就可順利執行。
那如果專案一定要設成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:從零開始的軟體開發生活」
請大家繼續支持 ^_^