【发布时间】:2018-01-28 04:11:32
【问题描述】:
今天遇到一个有趣的问题。
我有一堆 C# 代码通过 RunspacePool 创建使用 Powershell。 我给它输入命令,如果你自己运行 Powershell,它会准确输出 Powershell 会输出的内容,每一行都是 List 中的一个新条目。
奇怪的是,今天在程序中尝试“Test-NetConnection”命令时,结果不一致。
命令:
Test-NetConnection -ComputerName 'D123' -InformationLevel Detailed
D123 是同一网络上的 Windows 7 虚拟机
您可以在下面看到两个结果,似乎有 50% 的机会获得其中一个:
Count = 32
[0]: "ComputerName : D123"
[1]: "RemoteAddress : fe80::9503:8d01:d690:6c0a%14"
[2]: "PingSucceeded : True"
[3]: "PingReplyDetails : System.Net.NetworkInformation.PingReply"
[4]: "TcpClientSocket :"
[5]: "TcpTestSucceeded : False"
[6]: "RemotePort : 0"
[7]: "TraceRoute :"
[8]: "Detailed : True"
[9]: "InterfaceAlias : Internal"
[10]: "InterfaceIndex : 14"
[11]: "InterfaceDescription : Intel(R) 82574L Gigabit Network Connection #2"
[12]: "NetAdapter : MSFT_NetAdapter (CreationClassName = "MSFT_NetAdapter", DeviceID ="
[13]: ""{FDA85168-53B0-4F24-ABEB-BDC9F3A29958}", SystemCreationClassName = "CIM_NetworkPort","
[14]: "SystemName = "WIN-IAJUP1S3FL9.testdomain.com")"
[15]: "NetRoute : MSFT_NetRoute (InstanceID = "poB:DD9@?55"
[16]: "?55DD55"
[17]: "")"
[18]: "SourceAddress : MSFT_NetIPAddress (Name = "poB:DDl:pBD?:lDpC:mDmp?o/"
[19]: "?55"
[20]: "?55"
[21]: "55"
[22]: "", CreationClassName = "","
[23]: "SystemCreationClassName = "", SystemName = "")"
[24]: "NameResolutionSucceeded : True"
[25]: "BasicNameResolution : {}"
[26]: "LLMNRNetbiosRecords : {}"
[27]: "DNSOnlyRecords : {}"
[28]: "AllNameResolutionResults :"
[29]: "IsAdmin : True"
[30]: "NetworkIsolationContext : Private Network"
[31]: "MatchingIPsecRules :"
或者
Count = 9
[0]: "ComputerName : D123"
[1]: "RemoteAddress : fe80::9503:8d01:d690:6c0a%14"
[2]: "AllNameResolutionResults : 172.16.0.10"
[3]: "fe80::9503:8d01:d690:6c0a"
[4]: "InterfaceAlias : Internal"
[5]: "SourceAddress : fe80::b0f8:20b:f90c:cf3e%14"
[6]: "NetRoute (NextHop) : ::"
[7]: "PingSucceeded : True"
[8]: "PingReplyDetails (RTT) : 0 ms"
第二个块是它应该返回的内容,也是在 Powershell 上运行时命令显示的内容。
我想知道的是为什么它会返回这么多值,从外观上看,它会返回命令中所有成员的结果,而不仅仅是操作级别的成员(如果有意义,请看这里:@ 987654321@),但我完全不知道为什么。
EDIT1:输出块是来自 Visual Studio 的复制+粘贴,因此 Count = 32 是 Powershell 传回的行数,[number] 是列表位置。
EDIT2:似乎更多的细节来自在命令中添加“| select *”,这很奇怪,因为我的代码都没有这样做,它得到了 50% 的附加细节时间。
【问题讨论】:
-
您正在运行的确切命令是什么?您的第一个块看起来像“Test-NetConnection -ComputerName 'D123' -InformationLevelDetailed | Select *”的输出。但是“Count = 32”是从哪里来的?
-
对不起,我应该说。 Count = 32 来自 Visual Studio,块中的文本是从 Powershell 传回的结果的复制+粘贴。所以 [number] 是 List
的位置。编辑:啊哈,似乎更多细节来自添加“| select *”,但它是随机发生的。 -
-
嗯,这感觉有点麻烦。如果您想进一步诊断,请发布您用于执行 PowerShell 代码的最少量 C# 代码,并尝试在最简单的情况下重现。同时,您可以尝试添加
Select-Object -property <#properties you want#>并查看是否可以解决问题。 -
嗨@veefu,感谢您的建议。经过进一步调查,如果我将命令放入主窗口加载事件中,那么所有后续的都搞砸了,如果我从主窗口加载事件中删除它,那么它工作正常。不知道发生了什么,但我会看到有关获取特定属性的信息,以便更加一致。
标签: c# powershell