2

C#内で次のpowershellコマンドを実行しようとしています

パワーシェル:

"Get-ADDomainController -Filter * | Select-Object Name,OperatingSystem,OperatingSystemServicePack,Site | Format-List"

ここに私のC#コードがあります:

using (PowerShell inst = PowerShell.Create())
        {
            inst.AddCommand("Import-Module").AddParameter("Name", "ActiveDirectory");
            inst.AddScript(command);
            inst.Commands.AddCommand("Out-String");
            foreach (PSObject result in inst.Invoke())
            {
                Console.WriteLine("'{0}'", result);
            }

            Console.ReadLine();
        }

これは正常に機能し、結果を出力しますが、私ができるようにしたいのは、情報を反復処理することです

たとえば、印刷された結果は次のようになります

名前: xxx オペレーティング システム: Windows Server 2008 オペレーティング システムServicePack: サービス パック 2 サイト: xxx

foreach を実行して、名前、オペレーティング システム、サイトをリストに追加できるようにしたいと考えています。

それが理にかなっていることを願っています

4

1 に答える 1

1

わかりましたので、これが私が望んでいた修正です。他の誰かに役立つ場合に備えて共有すると思いました

私が最初にしたことは、powershell の Format-List コマンドを取り除くことでした。次に、次の C# コードを使用して結果を反復処理し、リスト内に配置しました。

List<DomainControllerLists> dcList = new List<DomainControllerLists>();
        using (PowerShell inst = PowerShell.Create())
        {
            inst.AddCommand("Import-Module").AddParameter("Name", "ActiveDirectory");
            inst.AddScript(command);
            Collection<PSObject> results = inst.Invoke();
            foreach (PSObject obj in results)
            {
                dcList.Add(new DomainControllerLists() { Name = obj.Members["Name"].Value.ToString(), OperatingSystem = obj.Members["OperatingSystem"].Value.ToString(), OperatingSystemServicePack = obj.Members["OperatingSystemServicePack"].Value.ToString(), Site = obj.Members["Site"].Value.ToString() });
            }
        }
        return dcList;

これで、必要な情報を含むリストが返されます foreach ループを LINQ ステートメントに変換することで、これをきれいにすることができます

于 2015-06-22T22:46:00.593 に答える