【问题标题】:Rename Vm Computer name using Bulk使用批量重命名虚拟机计算机名称
【发布时间】:2020-08-17 18:41:52
【问题描述】:

我在 Hyper-v 中有包含多个本地 VM 名称的文本文件:

新名字

IL-SRV

IL-TST

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 是您刚刚导入的整个列表。另外,您似乎正在尝试将它们重命名为相同的名称。显示您的 CSV 样本。
  • 没有人,我刚刚安装了它们,所以它们有通用名称,它说没有 VM 名称 IL-SRV 但有.. Hyper v 中的 VM 名称是 IL-SRV,我想要将计算机名称更改为与 VM 名称相同的名称..

标签: powershell virtual-machine hyper-v


【解决方案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 参数。 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
}

【讨论】:

  • 它工作!非常感谢 !但你能解释一下这是什么意思--> $line.newname 以及 $incomingname 如何收到我想重命名计算机的名称 $incomingname 如何知道收到新名称
  • @AngusY $incomingname 是通过-ArgumentList $name 获取其值的脚本块内的参数。如果您觉得这个答案解决了您的问题,您应该点击左侧的 ✓ 图标接受它。
  • 导入 CSV 时,您最终会得到一个具有一个或多个属性的对象。您需要在原始代码中使用点属性语法 - $computers.newname 来引用它们。我以这种方式命名的 $incomingname 希望澄清它是一个参数,您需要将名称传递给 -argumentlist。传递给参数列表的任何内容都将以$incomingname 的形式提供,请查看这些链接以获取有关对象adamtheautomator.com/powershell-objects mcpmag.com/articles/2017/06/01/… 的更多信息
猜你喜欢
  • 2014-03-07
  • 2023-03-18
  • 2021-10-19
  • 2022-05-26
  • 2010-10-05
  • 2023-03-27
  • 2015-05-16
  • 2012-11-03
  • 2013-12-13
相关资源
最近更新 更多