首页 > 解决方案 > PowerShell 错误:计算机名称在自定义函数中无效

问题描述

我正在尝试使用 Read-Host -Prompt 填写多个服务器名称和用户帐户名称,然后将它们传递给 invoke-command 以完成任务——即让某人成为本地管理员。我无法弄清楚为什么 PowerShell 会抛出此错误:“一个或多个计算机名称无效。如果您尝试传递 URI,请使用 -ConnectionUri 参数,或传递 URI 对象而不是字符串。”。

此外,我也收到错误:

“Add-LocalGroupMember:对象引用未设置为对象的实例。”

下面的代码示例:

if ($OptPrompt -eq 1) { 

    $prompt1 = Read-Host -Prompt 'Test Accounts'

    $prompt1.Split(",")

    $prompt1_1 = Read-Host -Prompt 'Test Servers'

    $prompt1_1.Split(",")

    Invoke-Command -ComputerName $prompt1_1 -ScriptBlock {Add-LocalGroupMember -Group 'Administrators' -Member $Using:prompt1} 

}

更多信息:

服务器在线

服务器中有“-”,例如“Server-22-test”

服务器正在响应 ping(主机名和 IP 地址)

在自己的作品上使用 Invoke-Command,但不在函数内部

没有防火墙或安全措施阻止相关帐户

谢谢您的帮助。

标签: functionpowershellpowershell-remotinginvoke-command

解决方案


您似乎期望$prompt1$prompt1_1包含以逗号分隔的名称。通过使用Read-Host来填充变量,它们将是 type String。您将需要依靠用户使用您的代码手动输入逗号分隔符。话虽如此,在 String 对象上执行该.Split()方法不会更新 String 对象。您必须更新变量赋值或将方法输出作为表达式传递到Invoke-Command.

# Method 1: Reassigning Variable Before Invoke-Command
if ($OptPrompt -eq 1) { 
    $prompt1 = Read-Host -Prompt 'Test Accounts'
    $prompt1 = $prompt1.Split(",")
    $prompt1_1 = Read-Host -Prompt 'Test Servers'
    $prompt1_1 = $prompt1_1.Split(",")
    Invoke-Command -ComputerName $prompt1_1 -ScriptBlock {Add-LocalGroupMember -Group 'Administrators' -Member $Using:prompt1} 
}


# Method 2: Passing Expressions into Invoke-Command
if ($OptPrompt -eq 1) { 
    $prompt1 = Read-Host -Prompt 'Test Accounts'
    $prompt1_1 = Read-Host -Prompt 'Test Servers'
    Invoke-Command -ComputerName $prompt1_1.Split(",") -ScriptBlock {Add-LocalGroupMember -Group 'Administrators' -Member ($using:prompt1).Split(",") } 
}

使用表达式的优点是您的原始变量保持不变。


推荐阅读