我在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
"
答案 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
}