C # хранит каждый профиль wlan в ObservableCollection

#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. Нет, я пытался описать это в комментариях. Он преобразует все выходные данные в одну строку, затем разбивает ее на массив строк, а затем для любой строки, в которой есть ':' что-то после нее, он берет часть после этого символа и возвращает их все в списке. Таким образом, это должен быть список имен профилей. Дайте мне знать, если это работает, потому что я не могу протестировать его на своем телефоне 🙂