2015-12-08 3 views
2

Я пытаюсь открыть командную строку Windows и запустить команду ping при нажатии кнопки ссылки. Кнопка Link выглядит что-то вроде:Запустить команду «ping» при нажатии кнопки ссылки

<asp:LinkButton runat="server" ID="lbFTPIP" OnCommand="lbFTPIP_OnCommand" CommandArgumnet="1.2.3.4" Text="1.2.3.4"/> 

Я попытался это для OnCommand:

protected void lbFTPIP_OnCommand(object sender, CommandEventArgs e) 
{ 
    string sFTPIP = e.CommandArgument.ToString(); 
    string sCmdText = @"ping -a " + sFTPIP; 
    Process p = new Process(); 
    p.StartInfo.FileName = "cmd.exe"; 
    p.StartInfo.Arguments = sCmdText; 
    p.StartInfo.RedirectStandardOutput = false; 
    p.StartInfo.UseShellExecute = false; 
    p.StartInfo.CreateNoWindow = false; 
    p.Start(); 
} 

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

Это часть веб-страницы, если это имеет значение.

+0

Что касается в 'cmd' команды: вам нужно иметь'/C' (или '/ k') в качестве первого аргумента (перед 'ping'), чтобы указать, что вы хотите запустить команду. –

+0

Вот и все! Спасибо. Я отсутствовал/C. Есть ли способ разрешить пользователю закрыть окно? Сейчас он закрывается после отображения ответов на команду ping> Я пытался p.WaitForExit(), но это не хорошо. – NoBullMan

ответ

3

Для того, чтобы открыть консоль и сразу же запустить команду, необходимо использовать либо /C или /K переключатель:

// Will run the command and then close the console. 
string sCmdText = @"/C ping -a " + sFTPIP; 

// Will run the command and keep the console open. 
string sCmdText = @"/K ping -a " + sFTPIP; 

Если вы хотите, чтобы возбудить «Нажмите любую клавишу», вы можете добавить PAUSE:

// Will run the command, wait for the user press a key, and then close the console. 
string sCmdText = @"/C ping -a " + sFTPIP + " & PAUSE"; 

EDIT:

Это, вероятно, будет лучше, чтобы перенаправить вывод, а затем отобразить результаты отдельно:

Process p = new Process(); 
// No need to use the CMD processor - just call ping directly. 
p.StartInfo.FileName = "ping.exe"; 
p.StartInfo.Arguments = "-a " + sFTPIP; 
p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.UseShellExecute = false; 
p.Start(); 
p.WaitForExit(); 

var output = p.StandardOutput.ReadToEnd(); 

// Do something the output. 
+0

Спасибо./K отлично работает. Когда я пытаюсь это сделать на сервере, он работает отлично. Когда я публикую сайт и запускаю его с моей рабочей станции, используя IE или Chrome, окно командной строки не отображается. Я пробовал на другой машине и получал то же самое. – NoBullMan

+0

@NoBullMan - Возможно, вы не сможете запускать с компьютеров конечных пользователей из-за уровня защиты браузеров. Было бы большой риск для безопасности, если бы браузер мог открыть консоль на вашем компьютере и запустить команду. Этот тип поведения (почему он работает на вашем сервере) будет больше для приложений типа «панель управления». Если вы хотите просмотреть результат, вы должны перенаправить вывод. Я обновлю ответ на это. –

+0

Спасибо. Я попытаюсь найти другой способ сообщить пользователю, что его тест на ping работал или нет; возможно, запустите команду в бесшумном режиме, не открывая окно командной строки, и получите результат и покажите его пользователю в элементе управления Ajax. Это приложение для интрасети. Если я не укажу/C или/K, предотвратит ли это открытие командной строки? – NoBullMan

0

Прежде всего, у вас есть что-то странное здесь CommandArgumnet="1.2.3.4", что с ошибкой. Другое дело -/C и пробел перед ping.

+0

это всего лишь образец. Фактический IP-адрес - это реальный адрес. – NoBullMan

+0

Я имею в виду, что у вас есть 'CommandArgumnet' вместо' CommandArgument'. – Kristopher

1

Вам не нужно выполнять cmd.exe, просто выполните ping.exe.

string sCmdText = @"-a " + sFTPIP; 
Process p = new Process(); 
p.StartInfo.FileName = "ping.exe"; 
p.StartInfo.Arguments = sCmdText; 
p.StartInfo.RedirectStandardOutput = false; 
p.StartInfo.UseShellExecute = true; 
p.StartInfo.CreateNoWindow = false; 
p.Start(); 

Кроме того, не установлено UseShellExecute = false если вы не собираетесь перенаправить вывод, который я удивлен, что вы не делаете.

+0

Пользователи хотят иметь возможность щелкнуть ссылку на IP-адрес и убедиться, что он отвечает. Однако, если бы я хотел перенаправить вывод, как бы мне это сделать? – NoBullMan