Mojtaba
Mojtaba

Reputation: 3512

Run bat file in c# throws not recognized error

I wan to add some DNS records in c# program via a bat file so I have written these lines in bat file:

    set servername=%1
set siteaddress=%2


"C:\Windows\System32\dnscmd.exe" %servername% /zoneadd %siteaddress% /primary /file  %siteaddress%.dns

and I have written these lines in 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();

I get this error "dnscmd.exe is not recognized as internal or external command..." but when I run bat file manually (outside of C#) all things are OK.

I changed my C# code to check what happened

Process.Start(@"C:\Windows\System32\dnscmd.exe");

I still get "not recognized ..." error.but I can see dnscmd.exe in "C:\Windows\System32". I changed my C# code again to check another thing:

Process.Start(@"C:\Windows\System32\cmd.exe");

and after that CMD windows will be opened??? any idea?

Upvotes: 0

Views: 2415

Answers (3)

Atul K.
Atul K.

Reputation: 101

In my case I created a console application to run a batch file with some java command but was getting 'java' not recognized as an internal command error.

Took me few hours but the solution is straight forward. My server had JVM running on 64 bit so I changed the platform target to 64 bit.

x86 is 32 bit and x64 is 64 bit. Project properties are below:

enter image description here

Upvotes: 1

James K
James K

Reputation: 4055

In answer to your second question, you can always check the environmental variable PROCESSOR_ARCHITECTURE to see if it contains the number 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
)

Possibly a more reliable method is to get it from the registry:

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

Upvotes: 1

Carsten Schütte
Carsten Schütte

Reputation: 4558

Try this code:

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(); 

The /c parameter says that the given command should run and then cmd.exe should exit. For details, run cmd /? in windows console.

You can also try what happens when you set ShellExecute to true. Then the process should start the same way like a file is double-clicked in explorer. The disadvantage of shell execution is that if the user changed the .BAT file default application to (for example ) notepad, the file will not be executed but opened in notepad.

If you also want to redirect the console output, look here: Executing Batch File in C#

Upvotes: 0

Related Questions