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