2016-12-30 36 views
0

代码目标:提取服务器的某些对象属性。我获得这些服务器的列表下面的代码:新对象:在PowerShell脚本中找不到“服务器”的重载和参数计数:“* numberofservers *”

$serverlist = (get-adcomputer -filter {dnshostname -like "*SQL*" -and operatingsystem -like "windows *server*"}).name 

然后我在列表中通过每个名称重复:

$serverlist | ForEach-Object { 

    $s = new-object Microsoft.SqlServer.Management.SMO.Server($serverlist) 

$s | Format-List @{Name = "Server";e={$s.Name}}, 
    @{Name = "VersionString";e={$s.VersionString}}, 
    @{Name = "Product Level";e={$s.ProductLevel}}, 
    @{Name = "Collation";e={$s.Collation}}, 
    @{Name = "Credentials";e={$s.Credentials}}, 
    @{Name = "Clustered?";e={$s.IsClustered}}, 
    @{Name = "One Owner?";e={$s.IsSingleUser}}, 
    @{Name = "Root";e={$s.RootDirectory}} | Out-File -path -append 

我收到新物体过载错误“服务器”有很多次,因为有服务器。我不确定会导致这个问题。当我为$ serverlist硬编码一个计算机名时,代码工作正常。 I.E.

$serverlist = @("Some-Server-01") 

一旦我使用服务器列表作为输入,我开始得到这个错误。帮助将不胜感激。

而且错误信息:

At C:\somepath 
+ $s = new-object Microsoft.SqlServer.Management.SMO.Server($serverli ... 
+ CategoryInfo   : InvalidOperation: (:) [New-Object], MethodException 
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand 
+1

您正在传递'$ S =新物体Microsoft.SqlServer.Management.SMO.Server($服务器列表)中的整个阵列'尝试用'$ _' – BenH

回答

1

你可能想创建一个新的Server对象的基础上,各个服务器的名字,而不是基于$ServerList,这是AD计算机对象的数组。请记住,您正在使用foreach循环,该循环为对象数组中的每个项目运行一次($ServerList)。

您无法使用计算机对象数组创建SQL SMO Server对象。您可以根据单个系统的名称创建一个。

$s = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Server -ArgumentList $PSItem 
+0

更改开关'$替换'$ serverlist' '$ s = new-object Microsoft.SqlServer.Management.SMO.Server($ serverlist)'中的'serverlist'也有诀窍。 – Kemilio

+0

$ _和$ PSItem均表示管道中的当前对象。 PSitem在PowerShell 3中添加,被认为更具可读性。但是$ _因为向后兼容性和简洁性而在使用中更常见。 – BenH

相关问题