我想通过bat文件在c#程序中添加一些DNS记录,所以我在bat文件中写了这些行:
set servername=%1
set siteaddress=%2
"C:\Windows\System32\dnscmd.exe" %servername% /zoneadd %siteaddress% /primary /file %siteaddress%.dns
我在C#中写了这些行:
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.WorkingDirectory = Application.StartupPath;
p.StartInfo.FileName = General.DnsBatPath;
p.StartInfo.Arguments = string.Format("{0} {1}", General.DnsServerName, txtSiteAddress.Text);
p.Start();
p.WaitForExit();
我收到此错误“dnscmd.exe未被识别为内部或外部命令...”但是当我手动运行bat文件(在C#之外)时,一切正常。
我更改了我的C#代码以检查发生了什么
Process.Start(@"C:\Windows\System32\dnscmd.exe");
我仍然“无法识别...”错误。但我可以在“C:\ Windows \ System32”中看到dnscmd.exe。 我再次更改了我的C#代码以检查另一件事:
Process.Start(@"C:\Windows\System32\cmd.exe");
然后将打开CMD窗口??? 任何想法?
答案 0 :(得分:1)
在回答第二个问题时,您始终可以检查环境变量PROCESSOR_ARCHITECTURE
,看它是否包含数字64
。
set servername=%1
set siteaddress=%2
if "%PROCESSOR_ARCHITECTURE%" equ "%PROCESSOR_ARCHITECTURE:64=%" (
REM 32bit
"C:\Windows\System32\dnscmd.exe" %servername% /zoneadd %siteaddress% /primary /file %siteaddress%.dns
) else (
REM 64bit
"%windir%\Sysnative\dnscmd.exe" %servername% /zoneadd %siteaddress% /primary /file %siteaddress%.dns
)
可能更可靠的方法是从注册表中获取它:
set servername=%1
set siteaddress=%2
for /f "tokens=3" %%x in ('reg Query HKLM\Hardware\Description\System\CentralProcessor\0 /v Identifier') do (
set arch=%%x
)
if %!arch:~-2!%==64 (
set dnsPath=%windir%\Sysnative
) else (
SET dnsPath=C:\Windows\System32
)
"%dnsPath%\dnscmd.exe" %servername% /zoneadd %siteaddress% /primary /file %siteaddress%.dns
答案 1 :(得分:1)
在我的情况下,我创建了一个控制台应用程序来运行带有一些java命令的批处理文件,但是“java”未被识别为内部命令错误。
花了我几个小时,但解决方案很简单。我的服务器让JVM在64位上运行,所以我将平台目标更改为64位。
x86是32位,x64是64位。项目属性如下:
答案 2 :(得分:0)
试试这段代码:
ProcessInfo psi= new ProcessStartInfo("cmd.exe", string.Format("/c {0} {1} {2}", General.DnsBatPath, General.DnsServerName, txtSiteAddress.Text);
psi.UseShellExecute = false;
process = Process.Start(psi);
process.WaitForExit();
/c
参数表示应该运行给定的命令,然后cmd.exe应该退出。有关详细信息,请在Windows控制台中运行cmd /?
。
您还可以尝试将ShellExecute
设置为true时发生的情况。然后,该过程应以相同的方式启动,就像在资源管理器中双击文件一样。 shell执行的缺点是,如果用户将.BAT文件默认应用程序更改为(例如)记事本,则该文件将不会被执行,而是在记事本中打开。
如果您还想重定向控制台输出,请查看此处:Executing Batch File in C#