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

时间:2020-08-17 18:41:52

标签: 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 $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
"

1 个答案:

答案 0 :(得分:1)

每次迭代都在处理$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参数。重命名计算机也具有-ComputerName参数,fyi。

由于我们关心的$ 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
}
相关问题