5

いくつかの背景: 私はラボ環境で作業しており、ストレス テストのために 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++
    }
}

コードを実行すると、指定されたパスでは Dismount-VHD が機能しないというエラーが表示されます。入って $vhdPath 変数を指定しようとしましたが、それでもブロックされます。

私が直面しているもう 1 つの問題は、while ステートメントが $val をインクリメントしていないことです。次のステートメントに入ると、エラーをスローして停止し、問題の VM には既にディスクが接続されていることを示します。

どんな助けでも大歓迎です。

4

2 に答える 2

7

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 

あなたがやろうとしていることの主な問題は、Dismount-VHDがパイプライン入力を受け入れないことです。たとえ受け入れたとしても、ボリューム オブジェクトをどう処理すればよいかわかりません (これはFormat-Volumeの出力です) 。

パイプラインを維持したい場合は、別の行に入れれDismount-VHD -Path $vhdPathば、すべてうまくいくはずです。

また、パスを作成するときは、問題を回避するために join-pathを使用する必要があります。

于 2015-04-24T01:56:49.687 に答える
0

パイプラインではマウント解除のみが機能しませんでした。

New-VHD -Path $image -SizeBytes $size |
    Mount-VHD -Passthru |
    Initialize-Disk -PassThru |     
    New-Partition -AssignDriveLetter -UseMaximumSize | 
    Format-Volume -FileSystem NTFS -Confirm:$false -Force
Dismount-VHD -Path $vhdPath
Get-VM -Id $vm | 
    Get-VMScsiController | 
    Add-VMHardDiskDrive -Path $image

遠くまで行けるか心配です。

于 2016-12-31T20:04:25.183 に答える