【问题标题】:Run bat file in c# throws not recognized error在 C# 中运行 bat 文件会引发无法识别的错误
【发布时间】:2023-03-27 08:39:01
【问题描述】:

我想通过一个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 窗口??? 有什么想法吗?

【问题讨论】:

  • 您的应用程序编译为 32 位还是 64 位? dnscmd.exe 是否存在于 C:\Windows\SysWOW64 中? This might be relevant.
  • “C:\Windows\SysWOW64”中没有 dnscmd.exe 路径中存在 cmd.exe 吗?我该怎么办?
  • 我将“C:\Windows\System32”更改为“%windir%\Sysnative”,我的问题就解决了。但是“%windir%\Sysnative”只存在于 64 位系统中(所以我的应用程序不能在 32 位系统上运行)。是否有适用于 32 位和 64 位系统的方法?

标签: c# batch-file


【解决方案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

【讨论】:

    【解决方案2】:

    在我的例子中,我创建了一个控制台应用程序来运行带有一些 java 命令的批处理文件,但得到“java”不被识别为内部命令错误。

    花了我几个小时,但解决方案很简单。我的服务器在 64 位上运行 JVM,所以我将平台目标更改为 64 位。

    x86 是 32 位,x64 是 64 位。项目属性如下:

    【讨论】:

      【解决方案3】:

      试试这个代码:

      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#

      【讨论】:

      • 已修复。对不起。确保批处理文件路径中没有空格,因为可能需要额外的 "。
      猜你喜欢
      • 2021-01-13
      • 2018-09-07
      • 2016-05-25
      • 2022-10-14
      • 2019-03-03
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多