Powershell nltest输出是否无效,无法与新对象一起使用?

Powershell nltest输出是否无效,无法与新对象一起使用?,powershell,active-directory,Powershell,Active Directory,运行nltest命令“nltest/dsgetdc:contoso.com”时,我得到以下输出: DC:\DC1.contoso.com 地址:\192.168.0.100 Dom Guid:1234567a-abc1-4d66-a421-153f0116d8c7 Dom名称:contoso.com 林名称:contoso.com DC站点名称:纽约 我们的网站名称:纽约 标志:PDC GC DS LDAP KDC TIMESERV…等 我要做的是捕获DC的输出,最终捕获地址字段。我尝试了以下方

运行nltest命令“nltest/dsgetdc:contoso.com”时,我得到以下输出:

DC:\DC1.contoso.com
地址:\192.168.0.100
Dom Guid:1234567a-abc1-4d66-a421-153f0116d8c7
Dom名称:contoso.com
林名称:contoso.com
DC站点名称:纽约
我们的网站名称:纽约
标志:PDC GC DS LDAP KDC TIMESERV…等

我要做的是捕获DC的输出,最终捕获地址字段。我尝试了以下方法,但它似乎不喜欢:

$svc=nltest /dsgetdc:contoso.com 
$obj=new-object psobject -property {DC=$svc.DC}
新对象:无法绑定参数“属性”。无法转换 DC=$svc.DC“System.Management.Automation.ScriptBlock”类型的值 键入“System.Collections.IDictionary”。第1行字符:36 +$obj=新对象psobject-属性{DC=$svc.DC} + ~~~~~~~~~~~~ +CategoryInfo:InvalidArgument:(:)[New Object],ParameterBindingException +FullyQualifiedErrorId:CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.NewObjectCommand


很明显,我打错了电话/使用的命令不正确。我甚至应该使用新对象来完成我的工作吗?

恐怕您没有正确地使用它(不完全正确)

newobject-Property
需要一个
[hashtable]
。您正在传递它,它表示一个
[scriptblock]
。您需要使用
@{}
来指示散列

但是,该命令的输出只是一个带换行符的字符串,您不能直接将其放入
@{}
中以生成哈希表

这里有一些代码可以帮你做到这一点:

$svc=nltest/dsgetdc:contoso.com
$h=@{}
$svc-分割'\r?\n'|每个对象{
如果($匹配'^(?[^:]+):\s+(?。+)$){
$h[$Matches['key']=$Matches['value']
}
}
$obj=新对象PSObject-属性$h

我们根据换行符拆分输出,然后对每一行进行正则表达式匹配,取出键和值,并将其添加到哈希中,然后在调用
新对象
时使用它,Briantist给出了一个很好的答案,详细说明了如何处理
nltest
的输出。由于
nltest
的输出已经使用name:value进行了良好的格式化,因此我建议使用

$results=((nltest/dsgetdc:contoso.com)-replace:“,”=”|
其中对象{$\匹配“=”})-连接“`r`n”|
从StringData转换
新对象-TypeName PSCustomObject-属性$results
我们使用
-replace:“,“=”
将所有冒号转换为等号。然后我们过滤掉那些没有等号的线。即删除任何状态消息,如“命令已成功完成”
ConvertFrom StringData
需要一个字符串,因此我们用新行连接这些行以生成单个字符串
convertfromstringdata
生成一个哈希表,存储在
$results

然后,就像您的问题和,我们制作一个
PsCustomObject
。输出如下所示

Dc Site Name  : CON
Our Site Name : CON
DC            : \DCCONTOSO.COM
Flags         : GC DS LDAP KDC TIMESERV WRITABLE DNS_DC DNS_DOMAIN DNS_FOREST CLOSE_SITE FULL_SECRET WS
Address       : \1254.885.1.478
Dom Name      : CONTOSO.COM
Dom Guid      : 0a3be324-f399-4b44-a3f1-b9c5aa6e7c5b
Forest Name   : CONTOSO.COM

只需将对象创建的结果保存到变量中,就可以像访问PowerShell中的任何对象一样访问属性。

非常酷,+1。我没有意识到从StringData转换而来的
实际上是存在的。我把它和PowerShell 5.0中的
ConvertFrom字符串
搞混了(希望你不介意,我编辑了你的答案,因为它有几个后者的实例)。@briantist不,完全可以。我的回答误导了其他人。非常感谢。对于我来说,这是一个学习的日子。干杯