使用Invoke-Command,但收到错误消息“一台或多台计算机名称无效”

时间:2018-11-06 11:16:30

标签: powershell

  

Invoke-Command:一台或多台计算机名称无效

运行此命令时出现错误:

Invoke-Command -ComputerName $Targets -ScriptBlock $ScriptBlock

$Targets是一个数组,由以下命令填充:

Get-ADComputer -Filter "Name -like '$Filter'" -SearchBase $OU |
    Select-Object -ExpandProperty Name |
    Sort-Object

计算机名称中通常包含-,但是我测试了没有任何特殊字符的计算机,并得到了相同的结果。

这是我的方法:

function Get-FilteredADComputers
{
     [CmdletBinding()]
     [OutputType([System.String[]])]
   param
       (
    [Parameter(Position = 0, Mandatory)]
    [ValidateSet('Site 1', 'Site 2', 'Site 3')]
    [String]
    $Site,

    [Parameter(Position = 1, Mandatory)]
    [ValidateSet('Client', 'Server')]
    [String]
    $ComputerType,
    [Parameter(Position = 2, Mandatory)]
    [String]
    $Filter
    )

$siteSecondLevel
switch($Site){
    "site 1"{$siteSecondLevel = "LVL 1"}
    "site 2"{$siteSecondLevel = "LVL 2"}
    "site 3"{$siteSecondLevel = "LVL 3"}
}
$OU = "OU=$ComputerType,OU=Devices,OU=$siteSecondLevel,OU=$Site,OU=MyOU,DC=mydomain,DC=com"
Get-ADComputer -Filter {Name -like $Filter} -SearchBase $OU | Select-Object -ExpandProperty Name | Sort-Object
}

我如何在测试环境中声明我的列表:

 $temp = Get-FilteredADComputers -Site Site1 -ComputerType Client -Filter 
"myfilter"
$target = @()

foreach($t in $temp){
    if($t -ne $null -or $t -ne ""){
       $target += $t
       }
}

通过将数组声明为$Targets = Get-FilteredADComputers

,我也得到了相同的结果

4 个答案:

答案 0 :(得分:0)

第一步是查看$ targets中的内容。我怀疑您的末尾可能会出现空白行,或者Invoke-Command拒绝将其作为计算机名拒绝使用其他

答案 1 :(得分:0)

$ Targets是列表吗?如果不是,请执行以下操作:$Targets2 = @($Targets) 这将使它成为列表,并且您可能会成功使用此解决方案。

它应该可以工作,但是,我会说改用Foreach。

foreach ($Target in $Targets)
{
    Invoke-Command -ComputerName $Target -ScriptBlock $ScriptBlock
}

大多数情况下,我都是这样做的,因为更容易进行故障排除和查找错误原因。

答案 2 :(得分:0)

尝试一下:

$temp = Get-FilteredADComputers
$targets = @() 

foreach($t in $temp)
{
    if($t -ne $null -and $temp -ne "")
    {
        $targets += $t
    }
}

在您的评论之一中,您说您要执行以下操作:

$temp = Get-FilteredADComputers -Site $site -ComputerType $computerType -Filter $filter 
if($temp -ne $null -or $temp -ne ""){ $targets += $temp }

但是使用支票$temp -ne $null,您只需检查它是否不为空,一旦$temp中有一个条目(即使它只是在第二位置),它就不再为空。

答案 3 :(得分:0)

出于Google搜索目的发布此内容。我的问题是我试图将DevOps变量传递给Powershell脚本。我必须更改我的DevOps (getTestBed() as any)._instantiated = false; (getTestBed() as any)._moduleFactory = undefined; 变量

发件人:

// @run-at       document-start

收件人:

WebServers

在我的Powershell中,我使用了:

server1,server2,server3