0

私は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ウィンドウが開きます??? 何か案が?

4

3 に答える 3

1

2 番目の質問への回答として、環境変数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
于 2012-10-21T22:21:20.447 に答える
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 を終了する必要があることを示しています。詳細については、cmd /?Windows コンソールで実行してください。

ShellExecutetrueに設定するとどうなるかを試すこともできます。その後、エクスプローラーでファイルをダブルクリックした場合と同じようにプロセスが開始されます。シェル実行の欠点は、ユーザーが .BAT ファイルの既定のアプリケーションを (たとえば) メモ帳に変更した場合、ファイルは実行されず、メモ帳で開かれることです。

コンソール出力もリダイレクトする場合は、こちらを参照してください: C# でのバッチ ファイルの実行

于 2012-10-21T09:33:44.903 に答える