使用批量重命名 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
}
我有包含 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
}