2016-10-28 2 views
0

Я пытаюсь выполнить эту команду CMD для изменения моего DNS, но он не работает. У меня нет ошибок. Он просит запустить администратор, но он не работает.Выполнение CMD с аргументами не работает

Если я вручную вводим аргументы в CMD, это действительно работает.

Вот мой код:

System.Diagnostics.ProcessStartInfo myProcessInfo = new System.Diagnostics.ProcessStartInfo(); 
myProcessInfo.FileName = Environment.ExpandEnvironmentVariables("%SystemRoot%") + @"\System32\cmd.exe"; 
myProcessInfo.Arguments = "set DNS1=198.168.97.1 " + 
    "set DNS2=5.2.2.2 " + 
    "set DNS3=206.19.29.17 " + 
    "set INTERFACE=Ethernet " + 
    "netsh int ipv4 set dns name='%INTERFACE%' static %DNS1% primary validate=no " + 
    "netsh int ipv4 add dns name='%INTERFACE%' %DNS2% index=2 " + 
    "netsh int ipv4 add dns name='%INTERFACE%' %DNS3% index=3" + 
    "ipconfig /flushdns"; 

myProcessInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
myProcessInfo.Verb = "runas"; 
System.Diagnostics.Process.Start(myProcessInfo); 
+0

Это три отдельные команды для выполнения один за другим (или поместить в пакетный файл и запустить его), и вы не Не нужно ничего устанавливать, потому что вы можете ввести значение set = непосредственно внутри netsh. Также, когда вы запускаете процессор CMD.EXE, вы всегда должны добавлять параметр/K или/C перед своими аргументами. – Steve

+0

Вы можете попробовать использовать '' && '' для разделения команд. Обратите внимание, что несколько команд, разделенных разделителем команд '' && '', принимаются для строки, если они окружены кавычками. – Darek

+0

@ Дарек, вы думаете, что это сработает? –

ответ

1

На самом деле то, что вы делаете, добавляя все ваши команды как обычные аргументы. Либо запустите Командную строку для каждой отдельной команды, либо добавьте символ & между командами для их цепочки. Кроме того, вам необходимо использовать команду /c, чтобы передать команду. Так что ваш код будет выглядеть следующим образом:

myProcessInfo.Arguments = "/c 'set DNS1=198.168.97.1 && " + 
            "set DNS2=5.2.2.2 && " + 
            "set DNS3=206.19.29.17 && " + 
            "set INTERFACE=Ethernet && " + 
            "netsh int ipv4 set dns name='%INTERFACE%' static %DNS1% primary validate=no && " + 
            "netsh int ipv4 add dns name='%INTERFACE%' %DNS2% index=2 && " + 
            "netsh int ipv4 add dns name='%INTERFACE%' %DNS3% index=3 && " + 
            "ipconfig /flushdns'"; 
+0

Спасибо, но это все еще не сработало. он не изменил DNS. –

+0

Можете ли вы проверить, работает ли она в обычной командной строке? В настоящее время я не на Windows-устройстве, поэтому это основано только на предположениях. – NikxDa

+0

Да, он работает в обычной командной строке CMD @NikxDa –

0

Возможно, что-то вроде этого:

var tempFileName = Path.GetTempFileName() + ".cmd"; 
File.WriteAllLines(tempFileName, new[] 
{ 
    "set DNS1=198.168.97.1 ", 
    "set DNS2=5.2.2.2 ", 
    "set DNS3=206.19.29.17 ", 
    "set INTERFACE=Ethernet ", 
    "netsh int ipv4 set dns name='%INTERFACE%' static %DNS1% primary validate=no ", 
    "netsh int ipv4 add dns name='%INTERFACE%' %DNS2% index=2 ", 
    "netsh int ipv4 add dns name='%INTERFACE%' %DNS3% index=3", 
    "ipconfig /flushdns" 
}); 

var myProcessInfo = new ProcessStartInfo(); 
myProcessInfo.FileName = Environment.ExpandEnvironmentVariables("%SystemRoot%") 
    + @"\System32\cmd.exe /C " + tempFileName; 
myProcessInfo.WindowStyle = ProcessWindowStyle.Hidden; 
myProcessInfo.Verb = "runas"; 
var myProcess = Process.Start(myProcessInfo); 
if (myProcess != null) 
    while (!myProcess.HasExited) 
    { 
     myProcess.Refresh(); 
     Thread.Sleep(TimeSpan.FromSeconds(1)); 
    } 
File.Delete(tempFileName); 
+0

Бог нет, это ужасно. Идея массива не так уж плоха, но затем, по крайней мере, выполняет каждую отдельную команду без записи в файл. Запись в файл дает много лишних накладных расходов. – NikxDa

+0

Выполнение каждой отдельной строки не имеет никакой цели. Каждый набор будет в своем собственном контексте. Он должен быть выполнен как одна строка с '' && '' или пакетным файлом. У меня нет уверенности в расширении командной строки на неопределенный срок, есть ограничения. – Darek

+0

Извините, мне это не удалось. В этом случае это решение действительно хорошо, хотя я бы предпочел решение выше. Я лично напишу функцию цепочки, которая может быть передана массивом и возвращает действительный аргумент cmd. – NikxDa

Смежные вопросы