试图创造.初始化和格式化VHD磁盘

Gav*_*lyn 5 powershell cmdlets vhd hyper-v

一些背景知识:我在实验室环境中工作,并且遇到了许多需要创建VHD并附加到VM进行压力测试的问题.我想出了一个脚本,允许用户使过程尽可能简单,如下所示:

$vms=Get-VM
$val = 0

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 formate in this example <E:\VHDS\>"
$fileName = Read-Host "The Drive will be <target>-<number>.vhdx.  Please Name the target "

$vhdSize = 1GB
$vmAmount = Read-Host "How many Drives should be attached to each VM?"

foreach ($vm in $vms)
{
    $n = $vm.Name

    while ($val -ne $vmAmount)
    {
        $vhdPath = ($Path + $fileName + '-' + $val + '.vhdx')
        New-VHD -Path $vhdPath -SizeBytes $vhdSize -Fixed | Mount-VHD -Passthru | Initialize-Disk -Passthru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume -FileSystem NTFS -Confirm:$false -Force | Dismount-VHD -Passthru
        Add-VMHardDiskDrive -VMName $n -Path $vhdPath 
        $val++
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,它给出了一个错误,指出Dismount-VHD不能与给定的路径一起工作.我试图进入并给它$ vhdPath变量,它仍然阻塞.

我遇到的另一个问题是while语句没有递增$ val.当它进入下一个语句时,它会抛出一个错误并停止,说有问题的VM已经附加了磁盘.

任何帮助,将不胜感激.

Jan*_*lka 5

我理解PowerShell中管道的美妙之处,但这有点太过分了:).如果拆分大型管道,事情就可以了.

    $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 
Run Code Online (Sandbox Code Playgroud)

您尝试做的主要问题是,Dismount-VHD不接受管道输入,即使它确实如此,它也不知道如何处理卷对象(这是Format-Volume的输出)

如果你想保留管道,Dismount-VHD -Path $vhdPath就单独划线,一切都应该好.

此外,在创建路径时,您应该使用join-path来避免问题.