我确定这应该是直截了当的,但我已经坚持了一段时间......
我正在尝试将服务名称(对于sql server)添加到数组中,但无法弄清楚如何执行此操作。我基本上希望数组内容看起来像这样的输出:
Get-Service -computername $server_name -name sql* | format-table -property name
我尝试过这样的事情,但$ service_name的内容很奇怪:
$service_name = (Get-Service -computername $server_name -name sql* -exclude *sqlwriter | format-table -property name)
无论我尝试错误还是在我的阵列中发出一些奇怪的消息。这应该容易/可能吗?我猜测我可以将结果转储到一个文本文件中,然后使用它的内容,但它有点混乱,而且开销比看上去要多。
答案 0 :(得分:2)
不确定,但在哪里找到这个(-Name
和/或-Exclude
的模式有什么变化?
PS> $names = (Get-Service -Name Sql* | select name)
PS> $names.GetType().IsArray
True
PS> $names.Length
3
PS> $names
Name
----
SQLBrowser
SQLSERVERAGENT
SQLWriter
如果您真的希望“名称”为System.String
数组,或者甚至沿着以下几行。
PS> $names = (Get-Service -Name Sql* | foreach { $_.Name -as [string]})
PS> $names[0].GetType().FullName
System.String
PS> $names
SQLBrowser
SQLSERVERAGENT
SQLWriter
但是请记住@alroc的答案中的好建议 - 也许你想尽可能长时间地保留Get-Service
的结果的实际类型(System.ServiceProcess.ServiceController
)并访问/使用{尽可能晚的{1}}属性。 YMMV。
答案 1 :(得分:1)
您正在使用管道中的format-table
。无论何时使用format-*
cmdlet,这都是数据行的结尾 - 它现在只是一组格式化的文本,它不再是您可以实际获得的数据使用
尝试将格式化为表格的名称进行查看:
$service_name = (Get-Service -computername $server_name -name sql* -exclude *sqlwriter);
$service_name | format-table -property name;
也就是说,我运行了你的版本和我的版本并得到了相同的 visual 输出 - 关键的区别在于我的数据存储在$service_name
中,而不仅仅是一堆文本(就像你的那样)。
编辑:
回应:
我真正需要的只是数组中的服务名称,然后在别处使用
$service_name = (Get-Service -computername $server_name -name sql* -exclude *sqlwriter) | select-object -expandproperty name;
或:
$service_name = (Get-Service -computername $server_name -name sql* -exclude *sqlwriter).name;
无需直接调用WMI。