在 Get-VM 上构建一个有效的 foreach 循环

Building a working foreach loop on Get-VM

我正在尝试构建一个循环,该循环将采用 Get-VM cmdlet,将其放入一个数组中,然后让我 运行 在每个 VM 上执行一个 foreach 语句。当我构建该阵列时,循环应该转到每个 VM,构建指定数量的 VHD,初始化它们,格式化它们,并将它们附加到 VM。

脚本中的逻辑有效。它将构建一个磁盘并将其附加到 VM。我失败的地方是脚本会出错,说它正在尝试构建的机器已经创建(我怀疑我的 $val 变量中存在范围错误)。它也会停止并且不会移动到下一个对象。

我怀疑我有范围错误,而且 ForEach-Object 可能是执行此脚本的更好方法。但是此时我迷路了,需要一点帮助。

一如既往,谢谢您,编码愉快!

Write-Host "This script is set up for quickly creating and initilizing VHDs"
$Path = Read-Host "Please enter the path you want to create the drives to. Use the format in this example <E:\VHDS\>"
$fileName = Read-Host "The Drive will be <target>-<number>.vhdx.  Please Name the target "
$vhdSize = 1GB
$vmAmount = 1

$GetVM = Get-VM

Foreach ($vm in $GetVM)
{
    $n = $vm.Name.ToString()
    $val = 0
    For($internalCounter = 0; $internalCounter -le $vmAmount; $internalCounter++)
        {
            $vhdPath = (Join-path $Path  ($fileName + '-' + $val + '.vhdx'))
            New-VHD -Path $vhdPath -SizeBytes $vhdSize -Fixed 
            Mount-VHD -Path $vhdPath
            $disk = get-vhd -path $vhdPath
            Initialize-Disk $disk.DiskNumber
            $partition = New-Partition -AssignDriveLetter -UseMaximumSize -DiskNumber $disk.DiskNumber
            $volume = Format-Volume -FileSystem NTFS -Confirm:$false -Force -Partition $partition
            Dismount-VHD -Path $vhdPath
            Add-VMHardDiskDrive -VMName $n -Path $vhdPath
        }
     $val++
}

$val = 0 移动到 Foreach 循环之前。否则,尽管您在循环结束时递增,但在循环开始时您又将其归零,因此 $val 始终为零。

在周末花了一些时间处理代码后,我开始删除所有用户启动的变量和 运行 一些 Write-Host。我发现 foreach 和内部 for 循环 运行 成功,但路径上的命名约定是回收,因此它无法 100% 工作。修复只是将 VM 名称变量放入路径中。一旦完成,它就像一个魅力。

这是完成的代码:

Write-Host "This script is set up for quickly creating and initilizing VHDs"
$Path = "E:\Hyper-V\Virtual hard disks\Test Drives\"
$fileName = "target"
$vhdSize = 7GB

$GetVM = Get-VM -ComputerName localhost
Foreach ($vm in $GetVM)
{
$n = $vm.Name
$vmAmount = 4
Write-Host "vm = " $n
For($val = 0; $val -le $vmAmount; $val++)
    {

      Write-Host "drive = " $val

      Write-Host "Path Before = " $Path

      $vhdPath = (Join-path $Path  ($n + "_" + $fileName + '-' + $val + '.vhdx'))

      Write-Host "Path after = " $vhdPath

      New-VHD -Path $vhdPath -SizeBytes $vhdSize -Fixed 
      Mount-VHD -Path $vhdPath
      $disk = get-vhd -path $vhdPath
      Initialize-Disk $disk.DiskNumber
      $partition = New-Partition -AssignDriveLetter -UseMaximumSize -DiskNumber $disk.DiskNumber
      $volume = Format-Volume -FileSystem NTFS -Confirm:$false -Force -Partition $partition
      Dismount-VHD -Path $vhdPath
      Add-VMHardDiskDrive -VMName $n -Path $vhdPath
    }        
}