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

时间:2015-04-24 18:03:29

标签: powershell for-loop foreach virtual-machine hyper-v

我尝试构建一个循环,它将获取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++
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

在周末花了一些时间使用代码后,我开始删除所有用户启动的变量并运行一些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
    }        
}