我遇到了创建新VHD(用于创建网络优化包的工具)的脚本问题。下面的脚本基本上拉出了输入目录的总大小,并将其作为变量传递给$ intval函数,该函数将字节大小转换为字符串$ size(nGB)。
我遇到的问题是cmdlet NEW-VHD要求-SizeBytes参数的格式为Uint64。如果您手动输入参数,例如
NEW-VHD -path $vhdpath -fixed -SizeBytes 10GB
cmdlet按预期运行并创建VHD,因为它接受10GB作为Uint64。我需要的是变量$ size以某种方式转换为Uint64,同时保留尾随的GB。在这种情况下,有没有办法模仿用户输入?
我理解下面的脚本没有经过优化或最好看,因为它只是一个概念证明。有关上述问题的任何建议都会受到欢迎!
代码
$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
答案 0 :(得分:3)
请使用:
$size = $intval / 1G
PowerShell有一个内置常量(GB),用于将值转换为千兆字节。另请参阅here。
编辑:阅读你的评论,我似乎误解了你的问题。 New-vhd需要以字节为单位的大小。如果你想要10 GB,你可以像这样输出值:
$size = [bigint] 10GB
你的问题中不清楚的是:“我需要的是变量$ size以某种方式转换为Uint64,同时保留尾随的GB”。
答案 1 :(得分: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
答案 2 :(得分:0)
不太晚,但我正在研究同样的问题。这是我找到的作品。
#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
希望它可以帮助那些人
答案 3 :(得分:0)
这是我使用配置文件进行服务器构建时解决此问题的方法:
# Get a string of the desired size (#KB, #MB, #GB, etc...)
$size_as_string = "4GB"
# Force PowerShell to evaluate the string
$size_as_bytes = Invoke-Expression $size_as_string
Write-Host "The string '$size_as_string' converts to '$size_as_bytes' bytes"