使用批量重命名 Vm 计算机名称

Rename Vm Computer name using Bulk

我有包含 Hyper-v 中本地 VM 名称数量的文本文件:

新名字

IL-SRV

IL-尖沙咀

IL-MGN

IL-BBT

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

我正在使用这个脚本

$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-Command 但使用的是本地变量。我猜你想做的是这个。

$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
}

在确认它将执行您想要的操作之后,您需要做的最后一件事是从 Rename-Computer 中删除 -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}
}

$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
}