1

新しい VHD (ネットワークに最適化されたパッケージを作成するためのツール) の作成のスクリプト作成に問題があります。以下のスクリプトは基本的に、入力ディレクトリの合計サイズを取得し、それを変数として $intval 関数に渡します。この関数は、バイト単位のサイズを文字列 $size (nGB) に変換します。

私が抱えている問題は、コマンドレット NEW-VHD が -SizeBytes パラメーターを Uint64 形式にする必要があることです。パラメータを手動で入力する場合、たとえば

NEW-VHD -path $vhdpath -fixed -SizeBytes 10GB

コマンドレットは意図したとおりに機能し、10GB を Uint64 として受け入れるため、VHD を作成します。私が必要とするのは、末尾の GB を保持しながら、変数 $size を何らかの形で Uint64 に変換することです。このシナリオでユーザー入力を模倣する方法はありますか?

以下のスクリプトは概念実証にすぎないため、最適化されていないか、見栄えがよくないことを理解しています。上記の問題に関する提案は大歓迎です!

コード

$dir = Read-Host 'What is the directory you are wishing to store inside a VHD?'
$objFSO = New-Object -com Scripting.FileSystemObject
$intval = $objFSO.GetFolder($dir).Size / 1GB
$size = "{0:N0}GB" -f $intval
$vhd = Read-Host 'What volume name do you wish to call your VHD (no spaces)?'
$vhdname = ($vhd + ".vhdx")
$vhdpath = ("C:\VHD\" + $vhdname)
NEW-VHD -fixed -path $vhdpath -SizeBytes $size

Microsoft のリソースをいくつか見ましたが、何もありませんでした

変更されたコード

$dir = Read-Host 'What is the directory you are wishing to store inside a VHD?'
$objFSO = New-Object -com Scripting.FileSystemObject
$intval = $objFSO.GetFolder($dir).Size
$size = $intval / 1GB
$vhd = Read-Host 'What volume name do you wish to call your VHD (no spaces)?'
$vhdname = ($vhd + ".vhdx")
$vhdpath = ("C:\VHD\" + $vhdname)
NEW-VHD -fixed -path $vhdpath -SizeBytes $size
4

4 に答える 4

3

これを使用するだけです:

$size = $intval / 1G

PowerShell には、値をギガバイトに変換するための組み込みの定数 (GB) があります。こちらもご覧ください

編集:あなたのコメントを読んで、私はあなたの質問を誤解しているようです。new-vhd にはバイト単位のサイズが必要です。10 GB が必要な場合は、次のように値をキャストします。

$size = [bigint] 10GB

あなたの質問で不明なのは、「末尾の GB を保持しながら、変数 $size を何らかの方法で Uint64 に変換することです」。

于 2013-09-04T06:45:42.210 に答える
2

奇妙な小さなバグを回避するために書いたコードを次に示します。

#-------------------------------VHD CREATION-------------------------------------#

#Create a VHD with a size of 3MB to get around variable bug
        New-VHD -Path $vhdpath -SizeBytes 3MB -Fixed
#Resize to target dir + extra
        Resize-VHD -Path $vhdpath -SizeBytes $size
#Mount/Format and Recursively Copy Items
        Mount-VHD $vhdpath -Passthru | Initialize-Disk -Passthru | New-Partition -UseMaximumSize | 
        Format-Volume -FileSystem NTFS -NewFileSystemLabel $volumename -Confirm:$false
            $drive = gwmi win32_volume -Filter "DriveLetter = null"
            $drive.DriveLetter = "B:"
            $drive.Put()
        Copy-Item -Force -Recurse -Verbose $dir -Destination "B:\" -ea SilentlyContinue
#Dismount
Dismount-VHD $vhdpath
于 2013-09-17T05:32:38.107 に答える
2

少し遅れましたが、私はこの同じ問題に取り組んでいます。これが私が見つけた作品です。

#Get the size of the folder
$FolderSize = (Get-ChildItem $ExportFolder -recurse | Measure-Object -property length -sum)
#Round it and convert it to GBs
[uint64]$Size = "{0:N0}" -f ($FolderSize.sum / 1GB)
#Add 1GB to make sure there is enough space
$Size = ($Size * 1GB) + 1GB
#Create the VHD
New-VHD -Path $VHDXFile -Dynamic -SizeBytes $Size

それが誰かを助けることを願っています

于 2016-01-08T19:21:52.247 に答える