自动启动/停止脚本程式
以下的 PowerShell 脚本程式是用以启动和停止虚拟机器,它会在特定事件发生时被 Task Scheduler 叫用。位于程式开头的一些变数必须先根据你的实体主机系统设定好。
- $vmrun_path:VMrun.exe 程式的完整路径。
- $auto_vms_path:含有你的虚拟机器之完整路径。
- $start_delay:启动两个虚拟机器之间的延迟秒数。
- $stop_delay:停止或暂停两个虚拟机器之间的延迟秒数。
函式 Get-AutoVMs 是此脚本程式里的一个工作主力。它找出位于 $auto_vms_path 中,必须被控制的虚拟机器,根据每个虚拟机器档案夹里的 +autovm.nn (nn 是启动顺序号码) 档案名称排序好,再将它们送回。
例如,若一个虚拟机器的档案夹中,有一个档案 +autovm.03,则它会在有档案 +autovm.05 的虚拟机器之前被启动。停止/暂停的顺序是启动顺序的相反。要停用一个虚拟机器的自动启动/停止,你只需要删除档案 +autovm.nn 或改名为像是 -autovm.nn。
脚本程式内真正控制虚拟机器的部分是两个 foreach 回路,一个用来启动它们,另一个用来停止/暂停它们。那两个回路使用 VMrun.exe 程式。启动一虚拟机器,程式码
& "$vmrun_path" -T ws start "$vm" nogui
被用到,nogui 指定它会在背景执行且没有 GUI。停止和暂停一虚拟机器,程式使用
& "$vmrun_path" -T ws $command "$vm" $option
其中 $command 可以是 'stop' 或 'suspend',$option 可以是 'hard' 或 'soft'。当使用选项 'soft',VMware 会要求客户系统先执行对应的脚本程式。当使用选项 'hard',客户系统将不会有机会执行它的脚本程式。
# Get script arguments
# $command: start, stop or suspend
# $option: hard or soft when $command is stop or suspend
param ([string] $command, [string] $option = "soft")
## defaults
# location of vmrun.exe
$vmrun_path = "${Env:ProgramFiles(x86)}\VMware\VMware VIX\VMrun.exe"
# location of virtual machine directory
$auto_vms_path = "E:\Virtual Machines"
# delay interval (in seconds) for starting up and stopping VMs
$start_delay = 90
$stop_delay = 30
## functions
# Get VMs to be auto-started at $path sorted by +autovms.xx name.
function Get-AutoVMs($path) {
Get-ChildItem "$path\*\+autovm.*" | Sort-Object Name `
| ForEach-Object {$_.DirectoryName+"\*.vmx"} | Get-ChildItem `
| ForEach-Object {$_.FullName}
}
# Get running VMs
# NOTE: this only works this VMs started in the same session, so we can't use it here.
function Get-RunningVMs() {
& "$vmrun_path" -T ws list | Where-Object {$_.EndsWith(".vmx")} `
| Sort-Object -Descending
}
## main program
if ($command.ToLower() -eq "start") {
# Retrieve VMs to be auto-start
$auto_vms = @(Get-AutoVMs $auto_vms_path)
# Start each VM in the list
foreach ($vm in $auto_vms) {
& "$vmrun_path" -T ws start "$vm" nogui
# Delay a little while.
if ($vm -ne $auto_vms[-1])
{ Start-Sleep -Seconds $start_delay }
}
exit 10
} elseif ((("stop", "suspend") -contains $command.ToLower()) `
-and (("soft", "hard") -contains $option.ToLower())) {
# Retrieve VMs, and reverse its order.
#$auto_vms = @(Get-RunningVMs)
$auto_vms = @(Get-AutoVMs $auto_vms_path)
[Array]::Reverse($auto_vms)
# Suspend each VM in the running list.
foreach ($vm in $auto_vms) {
& "$vmrun_path" -T ws $command "$vm" $option
# Delay a little while.
if ($vm -ne $auto_vms[-1])
{ Start-Sleep -Seconds $stop_delay }
}
exit 20
}
exit 1
允许脚本程式执行
当你储存了脚本程式到你的电脑上并试着执行它,会发现你不被允许执行它。那是因为在 Windows 7 上,预设的 ExecutionPolicy 是限制所有 PowerShell 脚本程式的执行。你必须改变 ExecutionPolicy 来允许一个管理员帐户执行本地的 PowerShell 脚本程式。那个管理员帐户将也是用来执行 Task Scheduler 动作。
首先,找到 Windows Powershell 于 Start Menu -> All Programs -> Accessories -> Windows Powershell。用右键点按它,并选用 'Run as administrator' 如果你不是以管理员帐户登入。在指令提示输入此指令
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
(如 PIC-1)。那将使该管理员帐户能够执行本地与签属过的远端 PowerShell 脚本程式。