Convert-WindowsImage.ps1 사용 방법 정리
WIM 이미지를 vhd 설치 파일로 변환해주는 PowerShell 스크립트가 있습니다.
Convert-WindowsImage.ps1 - WIM2VHD for Windows 10 (also Windows 8 and 8.1)
; https://gallery.technet.microsoft.com/scriptcenter/Convert-WindowsImageps1-0fe23a8f
; https://www.powershellgallery.com/packages/Convert-WindowsImage/10.0
이 스크립트를 다음과 같은 식으로 그냥 사용하시면 아무 동작도 안 합니다.
PS C:\temp> .\Convert-WindowsImage.ps1 -WIM 'c:\temp\nanoserver\NanoServer.wim' -VHD 'c:\temp\vhd\nanoserver.vhd' -DiskType Fixed -VHDFormat VHD -SizeBytes 10GB -Edition 1
PS C:\temp>
왜냐하면 Convert-WindowsImage.ps1은 내부에서 Convert-WindowsImage 메서드를 정의만 해두기 때문입니다. 따라서, 다음과 같이 ImportModule을 한 후에 Convert-WindowsImage 메서드를 호출하는 식으로 사용해야 합니다.
Import-Module .\Convert-WindowsImage.ps1
Convert-WindowsImage -WIM 'c:\temp\nanoserver\NanoServer.wim' -VHD 'c:\temp\vhd\nanoserver.vhd' -DiskType Fixed -VHDFormat VHD -SizeBytes 10GB -Edition 1
그런데 다음과 같이 명령을 내려 보면, 웬일인지 예외가 발생합니다.
PS C:\temp> Convert-WindowsImage -WIM 'c:\temp\nanoserver\NanoServer.wim' -VHD 'c:\temp\vhd\nanoserver.vhd' -DiskType Fixed -VHDFormat VHD -SizeBytes 10GB -Edition 1
Windows(R) Image to Virtual Hard Disk Converter for Windows(R) 10
Copyright (C) Microsoft Corporation. All rights reserved.
Version 10.0.9000.0.amd64fre.fbl_core1_hyp_dev(mikekol).141224-3000 Beta
ERROR : Cannot convert the "System.String[]" value of type "System.String[]" to type "System.Int32".
INFO : Log folder is %USERPROFILE%\AppData\Local\Temp\Convert-WindowsImage\6977f150-4e06-4eff-8123-d35b0e37e8e2
INFO : Closing Windows image...
INFO : Done.
예외가 발생하는 위치는 Convert-WindowsImage.ps1의 $Edition을 열거하는 코드인데,
$Edition | ForEach-Object -Process {
$Edition = $PSItem
if ([Int32]::TryParse($Edition, [ref]$null)) {
$openImage = $openWim[[Int32]$Edition] // 예외 발생
} else {
$openImage = $openWim[$Edition]
}
if ($null -eq $openImage) {
Write-W2VError "The specified edition does not appear to exist in the specified WIM."
Write-W2VError "Valid edition names are:"
$openWim.Images | %{ Write-W2VError " $($_.ImageFlags)" }
throw
}
...[생략]...
}
"$Edition = $PSItem" 설정하면서 열거형 변수가 $PSItem으로 겹쳐써져 오류가 발생하는 듯합니다. 그래서 다음과 같이 바꿔주면 정상적으로 동작합니다.
$Edition | ForEach-Object -Process {
$nEdition = $PSItem
if ([Int32]::TryParse($Edition, [ref]$null)) {
$openImage = $openWim[[Int32]$nEdition]
} else {
$openImage = $openWim[$Edition]
}
if ($null -eq $openImage) {
Write-W2VError "The specified edition does not appear to exist in the specified WIM."
Write-W2VError "Valid edition names are:"
$openWim.Images | %{ Write-W2VError " $($_.ImageFlags)" }
throw
}
...[생략]...
}
그 외에, Edition 인자로 숫자(인덱스) 말고 이름을 주는 방법이 있습니다. 이를 위해 WIM 파일에 포함된 Edition 이름을 알아야 하는데, 이는
imagex.exe를 이용해 나열할 수 있습니다.
C:\Program Files (x86)\Windows Kits\10\Tools\bin\i386>imagex /info e:\temp\NanoServer\NanoServer.wim
ImageX Tool for Windows
Copyright (C) Microsoft Corp. All rights reserved.
Version: 6.1.7600.16385
WIM Information:
----------------
Path: e:\temp\NanoServer\NanoServer.wim
GUID: {371880ba-0afa-4c84-a233-f1ba2d142e09}
Image Count: 2
Compression: LZX
Part Number: 1/1
Attributes: 0x8
Relative path junction
Available Image Choices:
------------------------
<WIM>
<TOTALBYTES>172753493</TOTALBYTES>
<IMAGE INDEX="1">
...[생략]...
<WINDOWS>
<ARCH>9</ARCH>
<PRODUCTNAME>Microsoft® Windows® Operating System</PRODUCTNAME>
<EDITIONID>ServerStandardNano</EDITIONID>
...[생략]...
</WINDOWS>
<NAME>Windows Server 2016 SERVERSTANDARDNANO</NAME>
</IMAGE>
<IMAGE INDEX="2">
...[생략]...
<WINDOWS>
<ARCH>9</ARCH>
<PRODUCTNAME>Microsoft® Windows® Operating System</PRODUCTNAME>
<EDITIONID>ServerDatacenterNano</EDITIONID>
...[생략]...
</WINDOWS>
<NAME>Windows Server 2016 SERVERDATACENTERNANO</NAME>
</IMAGE>
</WIM>
따라서 실행은 이렇게 하시면 됩니다.
Convert-WindowsImage -WIM 'e:\temp\nanoserver\NanoServer.wim' -VHD 'e:\temp\vhd\nanoserver.vhd' -DiskType Fixed -VHDFormat VHD -SizeBytes 10GB -Edition "Windows Server 2016 SERVERSTANDARDNANO"
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]