Как я могу исправить проблему со строкой ввода в этом командлете? - PullRequest
2 голосов
/ 14 июня 2019

В прошлом месяце я пытался изучить C # с целью написания некоторых модулей PowerShell.Я просмотрел некоторые статьи и документацию (Создание клиента с C # - Microsoft.Management.Infrastructure), чтобы попытаться собрать простой командлет CIM, который возвращал бы локальные сетевые адаптеры.

Библиотека классов компилируется нормально, но когда я запускаю команду в PowerShell, она показывает исключение формата.

Show-LocalAdapter : Input string was not in a correct format.

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

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

Вот код для командлета.

using System.Collections;
using System.Linq;
using System.Management.Automation;
using System.Text.RegularExpressions;
using Microsoft.Management.Infrastructure;

namespace NetTest
{
    [Cmdlet(VerbsCommon.Show, "LocalAdapter")]
    [OutputType(typeof(NetworkAdapter))]
    public class ShowLocalAdapterCmdlet : PSCmdlet
    {
        private string[] _manufacturer;
        private string _name;
        private bool? _physicalAdapter;
        private int _maxEntries = 100;

        [Parameter(Position = 0, ValueFromPipeline = true, ValueFromPipelineByPropertyName = true)]
        [Alias("Vendor")]
        public string[] Manufacturer
        {
            get { return this._manufacturer; }
            set { _manufacturer = value; }
        }

        [Parameter(Position = 1, ValueFromPipelineByPropertyName = true)]
        public string Name
        {
            get { return this._name; }
            set { _name = value; }
        }

        [Parameter(Position = 2, ValueFromPipelineByPropertyName = true)]
        public bool? PhysicalAdapter
        {
            get { return this._physicalAdapter; }
            set { _physicalAdapter = value; }
        }

        [Parameter(Position = 3)]
        public int MaxEntries
        {
            get { return this._maxEntries; }
            set { _maxEntries = value; }
        }

        protected override void BeginProcessing()
        {
            base.BeginProcessing();
        }

        protected override void ProcessRecord()
        {
            CimSession session = CimSession.Create("localHost");
            IEnumerable cimResults = session.QueryInstances(@"root\cimv2", "WQL", "SELECT * FROM Win32_NetworkAdapter");
            var query = cimResults.Cast<CimInstance>().Select(ReturnNetworkAdapter);

            // Filter Name
            if (Name != null)
            {
                query = query.Where(adapter => adapter.Name != null && adapter.Name.StartsWith(Name));
            }

            // Manufacturer Filter
            if (Manufacturer != null)
            {
                query = query.Where(
                    adapter =>
                        adapter.Manufacturer != null &&
                        Regex.IsMatch(adapter.Manufacturer.ToString(),
                            string.Format("^(?:{0})", string.Join("|", Manufacturer))));
            }

            // Physical Adapter: true or false
            if (PhysicalAdapter != null)
            {
                query = query.Where(adapter =>
                    adapter.PhysicalAdapter == PhysicalAdapter);
            }

            // Return objects
            query.Take(MaxEntries).ToList().ForEach(WriteObject);
        }

        private static NetworkAdapter ReturnNetworkAdapter(CimInstance item)
        {
            return new NetworkAdapter
            {
                Name            = item.CimInstanceProperties["Name"].ToString(),
                Description     = item.CimInstanceProperties["Description"].ToString(),
                DeviceId        = int.Parse(item.CimInstanceProperties["DeviceId"].ToString()),
                Manufacturer    = item.CimInstanceProperties["Manufacturer"].ToString(),
                NetConnectionId = item.CimInstanceProperties["NetConnectionId"].ToString(),
                PhysicalAdapter = bool.Parse(item.CimInstanceProperties["PhysicalAdapter"].ToString())
            };
        }
    }
}

Вот класс для объекта сетевого адаптера.

namespace NetTest
{
    public class NetworkAdapter
    {
        private string _name;
        private string _description;
        private int _deviceId;
        private string _manufacturer;
        private string _netConnectionId;
        private bool _physicalAdapter;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        public string Description
        {
            get { return _description; }
            set { _description = value; }
        }
        public int DeviceId
        {
            get { return _deviceId; }
            set { _deviceId = value; }
        }
        public string Manufacturer
        {
            get { return _manufacturer; }
            set { _manufacturer = value; }
        }
        public string NetConnectionId
        {
            get { return _netConnectionId; }
            set { _netConnectionId = value; }
        }
        public bool PhysicalAdapter
        {
            get { return _physicalAdapter; }
            set { _physicalAdapter = value; }
        }
    }
}

1 Ответ

1 голос
/ 14 июня 2019

Звонки, подобные этому item.CimInstanceProperties["Name"].ToString() - это не то, что вы ожидаете. Посмотрите на свойство Value:

private static NetworkAdapter ReturnNetworkAdapter(CimInstance item)
{
    return new NetworkAdapter
    {
        Name = item.CimInstanceProperties["Name"].Value.ToString(),
        Description = item.CimInstanceProperties["Description"].Value?.ToString(),
        DeviceId = int.Parse(item.CimInstanceProperties["DeviceId"].Value.ToString()),
        Manufacturer = item.CimInstanceProperties["Manufacturer"].Value?.ToString(),
        NetConnectionId = item.CimInstanceProperties["NetConnectionId"].Value?.ToString(),
        PhysicalAdapter = bool.Parse(item.CimInstanceProperties["PhysicalAdapter"].Value.ToString())
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...