Powershell 使用大容量重命名Vm计算机名

Powershell 使用大容量重命名Vm计算机名,powershell,virtual-machine,hyper-v,Powershell,Virtual Machine,Hyper V,我有一个文本文件,其中包含Hyper-v中的本地VM名称数: 新名称 IL-SRV IL-TST IL-MGN IL-BBT 这是我的hyper-V环境中的名称,我想使用Powershell和bulk更改它们的计算机名 我正在使用这个脚本 $computers = import-csv -Path C:\Users\Itay\Desktop\Servers.txt foreach ($newname in $computers){ Invoke-Command -VMName $comp

我有一个文本文件,其中包含Hyper-v中的本地VM名称数:

新名称

IL-SRV

IL-TST

IL-MGN

IL-BBT

这是我的hyper-V环境中的名称,我想使用Powershell和bulk更改它们的计算机名

我正在使用这个脚本

$computers = import-csv -Path C:\Users\Itay\Desktop\Servers.txt



foreach ($newname in $computers){

Invoke-Command -VMName $computers.newname -Credential administrator -ScriptBlock {Rename-Computer -NewName $computers.newname -Restart -Force}
}
但是我收到了这个错误

    "
Invoke-Command : The input VMName IL-SRV  does not resolve to a single virtual machine.
At line:11 char:1
+ Invoke-Command -VMName $computers.newname -Credential administrator - ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ArgumentException
    + FullyQualifiedErrorId : InvalidVMNameNotSingle,Microsoft.PowerShell.Commands.InvokeCommandCommad
"

每次迭代处理$computers.newname的整个列表

在循环中创建变量$newname,但从未使用过它。在运行进行更改的命令时,尤其是当您不熟悉powershell的工作方式时,应该非常小心。另一个突出的问题是在远程计算机上使用Invoke命令,但使用的是局部变量。我猜你想做的就是这个

$CSVData = import-csv -Path C:\Users\Itay\Desktop\Servers.txt

foreach ($line in $CSVData){

    Invoke-Command -VMName $line.newname -Credential administrator -ScriptBlock {Rename-Computer -NewName $using:line.newname -Restart -whatif}
}
注意$using:line变量。这将向远程计算机提供本地变量的内容。另一种处理方法是使用-Argumentlist。我建议在这样做时使用命名参数,如下所示

$CSVData = import-csv -Path C:\Users\Itay\Desktop\Servers.txt

foreach ($line in $CSVData){

    Invoke-Command -VMName $line.newname -Credential administrator -ScriptBlock {
        Param($incomingname)
    
        Rename-Computer -NewName $incomingname -Restart -whatif
    
        } -ArgumentList $line.newname
}
在确认它将执行所需操作后,您需要做的最后一件事是从重命名计算机中删除-WhatIf参数。Rename Computer还有一个-ComputerName参数,仅供参考

其中任何一个也可以这样写,因为$CSVData上只有一个我们关心的属性

$CSVData = import-csv -Path C:\Users\Itay\Desktop\Servers.txt

foreach ($name in $CSVData.newname){

    Invoke-Command -VMName $name-Credential administrator -ScriptBlock {Rename-Computer -NewName $using:name -Restart -whatif}
}


$computers.newname是您刚刚导入的整个列表。另外,你似乎正试图将它们重命名为相同的名称。显示您的CSV示例。没有人,我只是安装了它们,所以它们有通用名称,它说没有VM名称IL-SRV,但有。。只是Hyper v中的虚拟机名称是IL-SRV,我想将计算机名称更改为与虚拟机名称相同的名称..它可以工作!非常感谢你!但是你能解释一下它是什么意思->$line.newname和$incomingname是如何接收名称的吗我想重命名这台计算机$incomingname如何知道接收新名称的name@AngusY$incomingname是scriptblock内的参数,该参数获取其值trhough-ArgumentList$name。如果你觉得这个答案解决了你的问题,你应该点击✓ 图标。当您导入CSV时,您将得到一个具有一个或多个属性的对象。您需要在原始代码中使用点属性语法-$computers.newname引用它们。我以这种方式命名$incomingname,希望能澄清这是一个参数,您需要在名称中传递给with-argumentlist。传递到参数列表的任何内容都将作为$incomingname提供。有关对象的更多信息,请查看这些链接
$CSVData = import-csv -Path C:\Users\Itay\Desktop\Servers.txt

foreach ($name in $CSVData.newname){

    Invoke-Command -VMName $name -Credential administrator -ScriptBlock {
        Param($incomingname)
    
        Rename-Computer -NewName $incomingname -Restart -whatif
    
        } -ArgumentList $name
}