最近工作上,常使用Hyper-V來練習架設環境,而每次想要再次練習就還要再按一次圖形化介面,一台按一次,n台就要按n次,麻煩!所以才會誕生這篇,研究了一下如何用簡單的powershell,來自動化「創建n次差異硬碟,並且掛載到虛擬機器上」這個動作。

指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#build-VHD -Path 'E:labtest' -Parent 'E:VMWinServer2019base.vhdx' -List "AD","Server1","Server2","Server3"
#使用方式:build-VHD -Path <你要建立的位置> -Parent <父系磁碟位置> -List <主機列表>
function build-VHD {
Param (
[parameter(position = 0, mandatory = $true)][string]$Path,
[parameter(position = 1, mandatory = $true)][string]$Parent,
[parameter(ValueFromPipeline = $true)][string[]]$List,
[parameter(position = 2, mandatory = $false)][Alias("open", "run")][switch]$openVM
)
begin {
write-host "Begin."
# 如果指定父系磁碟不存在即離開
if (-not(Test-Path $Parent)) {
write-host "The parent is not defined."
exit
}
# 如果指定目錄不存在,就建立目錄
if (-not(Test-Path $Path)) {
Write-Host "Build ${Path}"
[void](mkdir $Path)
}
else {
write-host "${Path} exists."
}
}
process {
Foreach ($VMName in $List) {
$VHDPath = "${Path}${VMName}.vhdx"
if (-not(Test-Path $VHDPath)) {
# 狀態表示
Write-Progress -Activity "Building VHD..." -Status "Building ${VMName}..." -PercentComplete ((($List.indexof($VMName) + 1) / $List.count) * 100)
# 建立差異硬碟
[void](new-vhd -path $VHDPath -ParentPath $Parent -diff)
Write-Host "${VHDPath} is finished."
# 設定同名的硬碟到同名的主機
Set-VMHardDiskDrive -VMName $VMName -path $VHDPath
}
else {
Write-Host "${VMName} exists."
}
# 順便開啟VM
if ($openVM) {
Foreach ($VMName in $List) {
start-vm -name $VMName
write-host "Running ${VMName}"
}
}
}
}
end {
write-host "End."
}
}

說明

要先建好機器

此指令要先建立好機器才能使用 file

指令

build-VHD -Path 'E:labtest' -Parent 'E:VMWinServer2019base.vhdx' -List "AD","Server1","Server2","Server3"

使用方式

build-VHD -Path <你要建立的位置> -Parent <父系磁碟位置> -List <主機列表>

設定開啟pwsh載入函數

只需要使用notepad把上面的函數加進去後存成一個ps1檔案,開啟powershell輸入$profile,在裏頭加入Import-module <這個ps1檔案>,就可以在每次開啟的時候載入這個function。

註:$profile Powershell會在執行服務時,執行這檔案裡面的動作。

使用效果

file

後記

其實這麼簡單的東西,對於任何會寫Hello world的人而言,大概都是塊蛋糕,不過之前完全不會powershell時,用「快速建立差異硬碟」等等關鍵字丟google,其實也找不到什麼相關的文章,所以想說來寫一篇騙騙流量XD。

之後有時間的話,再來研究一下如何把這個指令包成一個function,使用單行指令和arguments來執行這個動作,到時候再更新回來。

22/8/1 已經更新ㄌ