#c# #wifi #netsh #ssid
#c# #wifi #netsh #ssid
Вопрос:
Я должен хранить каждое имя профиля в наблюдаемой коллекции, но я не знаю, как это сделать, я выполнил большую часть проекта, но я не знаю, как получить доступ к КАЖДОМУ имени профиля, что я не знаю, как сделать.
Я видел, что люди используют Substrings и indexOf, я пытался, но проблема в том, что у меня есть более одного имени профиля для отображения, поэтому это не работает.
Я следовал этому руководству: https://www.youtube.com/watch?v=Yr3nfHiA8Kk Но он показывает, как это сделать, но с подключенным в данный момент Wi-Fi
InitializeComponent();
ObservableCollection<String> reseaux = new ObservableCollection<String>();
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "netsh.exe";
//p.StartInfo.Arguments = "wlan show interfaces";
p.StartInfo.Arguments = "wlan show profile";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
/*foreach (System.Diagnostics.Process profile in profile)
{
reseaux.Add(reseauName);
}*/
lesReseaux.ItemsSource = reseaux;
Комментарии:
1. Класс процесса не имеет никаких переменных среды, таких как PATH. Поэтому вам нужно указать полное имя пути netsh.exe .
2. Он работает, мой проект может найти netsh.exe
3. Разве аргумент
show
не должен бытьprofiles
(сs
)? Когда я открываю командное окно и набираюnetsh.exe
, за которым следуетwlan show /?
, я не вижуprofile
опции.4. Кроме того, поскольку вы перенаправляете вывод, разве вы не должны получать данные
p.StandardOutput
?5. Для чтения стандартного вывода см. msdn ( learn.microsoft.com/en-us/dotnet/api /… ). Это поток, и вы не можете перечислять через поток или строку. Вывод, вероятно, состоит из нескольких строк, и вам нужно разделить конец строки.
Ответ №1:
На данный момент у меня нет способа проверить это, но, основываясь на выводе, который вы показали на изображении, кажется, что вы можете взять весь вывод, разделить его на отдельные строки, разделить каждую строку на ':'
символ, а затем выбрать вторую часть из этого разделения, чтобы получить имя.
Но сначала, я думаю, что аргумент to show
"profiles"
(множественное число), и, согласно одному из комментариев, вам может потребоваться использовать полный путь к netsh.exe
. Так что код может выглядеть так:
var startInfo = new ProcessStartInfo
{
FileName = Path.Combine(Environment.SystemDirectory, "netsh.exe"),
Arguments = "wlan show profiles",
UseShellExecute = false,
RedirectStandardOutput = true,
};
var p = Process.Start(startInfo);
p.WaitForExit();
После этого выходные данные команды будут сохранены в p.StandardOutput
(что является a StreamReader
), и мы можем получить все это в виде строки, используя .ReadToEnd()
:
var output = p.StandardOutput
// Get all the output
.ReadToEnd()
// Split it into lines
.Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
// Split each line on the ':' character
.Select(line => line.Split(new[] {':'}, StringSplitOptions.RemoveEmptyEntries))
// Get only lines that have something after the ':'
.Where(split => split.Length > 1)
// Select and trim the value after the ':'
.Select(split => split[1].Trim());
Теперь, когда у нас есть IEnumerable<string>
имена, мы можем инициализировать нашу коллекцию с его помощью:
var reseaux = new ObservableCollection<string>(output);
Комментарии:
1. Боже, спасибо, я так не думал, я был уверен, что мне нужно найти файл, в котором есть эта информация, и мне пришлось пойти и извлечь его, чтобы поместить его в свой список, поэтому, если я правильно понимаю ваш код, вы создали список, и avex поместил в него каждую выделенную строку?
2. Нет, я пытался описать это в комментариях. Он преобразует все выходные данные в одну строку, затем разбивает ее на массив строк, а затем для любой строки, в которой есть
':'
что-то после нее, он берет часть после этого символа и возвращает их все в списке. Таким образом, это должен быть список имен профилей. Дайте мне знать, если это работает, потому что я не могу протестировать его на своем телефоне 🙂