VMware PowerCLI从零安装教程:Windows 10环境下连接vCenter与ESXi实战
2026/9/18 6:39:04 网站建设 项目流程

如果你平时要管几台VMware虚拟机,或者在公司里维护过vSphere环境,一定遇到过这种场景:在vCenter Web界面里一台一台点鼠标,创建虚拟机、调配置、打快照、看状态,重复操作一多,整个人都会麻木。我最早接触PowerCLI就是因为要批量给几十台虚拟机做快照,手工点了一个下午才弄完,后来学会了这个工具,同一个任务用一行命令几十秒就能跑完。这篇就是我整理的在Windows 10上从零安装VMware PowerCLI的完整过程,包含我踩过的坑、离线安装方案、连接vCenter和ESXi的配置方法,以及几个实际能用的命令示例。

PowerCLI是VMware官方出品的PowerShell模块,用来管理和自动化vSphere环境,包括vCenter Server、ESXi主机、虚拟机、存储、网络等所有核心对象。它可以理解成vSphere的“命令行版本”,你能在网页上做的操作,绝大多数都能用PowerCLI完成,而且还能批量、还能写脚本定时跑。这篇文章适合两类读者:一类是刚接触虚拟化运维、想把日常操作脚本化的新手,另一类是已经在用vSphere、但一直用图形界面操作、想提升效率的运维同学。我会尽量把每一步都讲透,包括为什么要这么做。

1. 安装前的准备工作

装PowerCLI不是双击一个exe就完事,它的依赖环境先要搞定。很多人在第一步就卡住,通常都是因为Windows 10自带的PowerShell版本太老,或者网络源没配好。

1.1 确认Windows 10的PowerShell版本

PowerCLI本身是PowerShell模块,所以先得确认系统里的PowerShell是什么版本。Windows 10系统默认自带Windows PowerShell 5.1,但微软官方现在推荐的PowerShell 7.x和Windows PowerShell 5.1是两个不同的产品,后者属于Windows自带组件,前者需要单独安装。

这里有个容易混淆的点:PowerCLI新版本(特别是12.0以后)对PowerShell版本有明确要求。VMware官方兼容性列表里写得很清楚,PowerCLI 12.0以上版本推荐使用PowerShell 7.0以上环境,虽然也能在Windows PowerShell 5.1上运行部分功能,但有些新模块和命令会不兼容。所以我的建议是直接装PowerShell 7.x,省得以后用着用着遇到“这个命令不存在”的诡异报错。

在开始之前,先打开PowerShell窗口确认版本:

$PSVersionTable.PSVersion

如果显示Major版本是5.1,建议去微软官网下载PowerShell 7.x的安装包。下载的时候注意选对系统架构,Win10基本都是64位系统,装msi包就行。安装过程是图形界面,一路Next就能完成,装好后打开新的“PowerShell 7”终端,这时候再执行上面的命令,版本号就会变成7.x。

我个人的习惯是用PowerShell 7搭配Windows Terminal使用,Windows Terminal可以在微软商店免费安装,比系统自带的控制台好用很多,支持多标签、自定义主题,管理多个服务器连接时方便不少。

1.2 TLS版本与网络源检查

这一步容易被忽略,但非常重要。PowerCLI是从PowerShell Gallery在线仓库下载安装的,而PowerShell Gallery要求客户端必须支持TLS 1.2协议。Windows 10系统默认可能只开启了TLS 1.0,这就导致调用Install-Module命令时频繁报错,或者下载到一半直接超时断开。

解决办法是在安装模块之前,手动指定TLS版本:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

上面的命令只对当前PowerShell会话生效,也就是说每次打开新窗口都要重新执行一遍。如果想省事,可以把它写进PowerShell的启动配置文件$PROFILE里,这样每次开PowerShell自动生效。

顺便提醒一下,如果你所在网络环境访问powershellgallery.com比较慢或者不通,安装模块时会一直卡在“正在从源中下载”的状态。这种情况后面的离线安装方案可以直接解决。

1.3 PowerShell执行策略设置

Windows系统默认禁止运行PowerShell脚本,执行策略是Restricted,这意味着即使模块下载成功,也可能因为脚本权限问题加载失败。安装前建议把执行策略改成RemoteSigned,这个策略的意思是本地创建的脚本可以运行,从网上下载的脚本需要数字签名。

修改执行策略的命令:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

这里我特意用了-Scope CurrentUser,只对当前用户生效,不需要管理员权限,也不会影响系统的全局配置。如果你是在公司电脑上操作,没有管理员权限也没关系,这个方式完全够用。

提示:如果后续PowerCLI连接vCenter的证书校验有问题,或者需要加载某些未签名的模块,可能还需要临时用Bypass模式,但正常工作环境下RemoteSigned足够。

2. 正式安装PowerCLI模块

准备工作做完后,就可以正式开始安装了。这个过程如果顺利的话,几分钟就能完成。核心命令就一条:Install-Module。

2.1 使用Install-Module在线安装

打开PowerShell 7(不是Windows PowerShell 5.1窗口),先设置TLS,再安装模块:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 Install-Module -Name VMware.PowerCLI -Scope CurrentUser

执行后会弹出NuGet提供程序的安装确认,输入Y回车。接着可能会提示“从PSGallery安装模块”,再输入Y。如果当前用户对PowerShell Gallery的源没有信任配置,系统会问是否将PSGallery设置为受信任的源,这里建议输入Y,以后安装其他模块就不用反复确认了。

安装过程会持续几分钟,取决于网络速度。PowerCLI不是一个小模块,它有几十个依赖子模块,包括VMware.VimAutomation.Core、VMware.VimAutomation.Cis.Core、VMware.VimAutomation.Vds等,安装器会自动把所有依赖包一并下载。看到进度条走完之后,输入以下命令确认安装结果:

Get-Module -ListAvailable VMware.PowerCLI

如果正常输出模块信息,说明安装成功。

2.2 离线安装方案

在线安装是最理想的情况,但现实里很多公司机房和办公网是物理隔离的,或者下载速度实在惨不忍睹。这时候需要在一台能联网的机器上下载好整个模块包,再拷贝到目标机器上离线安装。

离线安装的核心过程分两步:

第一步,在联网机器上,使用Save-Module命令把模块下载到本地目录,而不是直接安装:

Save-Module -Name VMware.PowerCLI -Path D:\PowerCLI_Offline

这条命令会把PowerCLI及其所有依赖模块,完整地下载到指定的本地文件夹,不会修改这台机器的PowerShell环境。

第二步,把这个文件夹整个拷贝到目标机器上,放到PowerShell的模块搜索路径中。Windows 10上,当前用户的模块默认路径是:

C:\Users\用户名\Documents\PowerShell\Modules

PowerShell 7的默认路径和Windows PowerShell 5.1不一样,PowerShell 7读的是C:\Users\用户名\Documents\PowerShell\Modules。把整个VMware.PowerCLI文件夹放进去之后,需要确认里面的目录结构是VMware.PowerCLI\版本号\这种形式,不能把嵌套层级搞错。

还有一点,依赖模块也要一起拷贝过去。PowerCLI解压后会有很多VMware.VimAutomation开头的文件夹,这些都必须原样保留。我自己整理离线包时,习惯把整个Modules目录复制过去,避免漏掉子模块。放置完成后,在新PowerShell窗口中执行Get-Module -ListAvailable VMware.PowerCLI检查是否识别。

2.3 安装后的模块加载与版本校验

模块安装好不等于就能用,需要先导入到当前会话中。虽然PowerCLI支持自动加载模块,但为了避免首次调用时卡顿太久,我一般会手动执行导入命令:

Import-Module VMware.PowerCLI

导入过程中会加载一系列依赖模块,第一次可能会等待十几秒到几十秒,如果一切正常,命令行不会输出任何报错信息。接着查看版本,确认加载的是新装的那个版本:

Get-Module VMware.PowerCLI | Select-Object Name, Version

检查通过后,还可以顺手看看PowerCLI里都有哪些命令。PowerCLI的命令遵循Get-VMNew-VMSet-VM这种动词-名词命名模式,与PowerShell原生风格一致。执行Get-Command -Module VMware.PowerCLI可以看到完整的命令列表,数量通常在一百条以上,说明环境没问题。

3. 初始化配置与连接vCenter

安装完成后还不能直接连服务器,PowerCLI默认有一些安全策略,比如会拦截不受信任的证书、会弹出CEIP客户体验改善计划提示,这些都要先处理好,否则连接vCenter时很可能会被证书问题挡住。

3.1 关闭CEIP和证书检查

PowerCLI第一次运行时会问是否加入CEIP(客户体验改善计划),这就是一个问卷,影响不大,不想被问就直接关掉。同时,很多企业的vCenter证书是自签名证书,默认情况下PowerCLI会因为证书不受信任而拒绝连接,也必须提前设置为忽略证书校验。

两条命令解决:

Set-PowerCLIConfiguration -ParticipateInCEIP $false -Confirm:$false Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false

第一条关闭CEIP,第二条设置遇到无效证书时忽略错误。第二条尤其重要,我见过很多新手第一次连vCenter时直接报The server certificate is not trusted,然后卡在那里不知道怎么办,其实就是没改这个配置。

Set-PowerCLIConfiguration还有很多其他配置项,比如-DefaultVIServerMode可以设置默认连接模式,还可以设置WebSession超时时间。另外还有-Scope参数,建议显式指定-Scope User,表示配置只对当前用户生效。

3.2 连接vCenter Server

配置搞定后,开始连接。连接vCenter的命令很简单:

Connect-VIServer -Server vcenter.example.com -User administrator@vsphere.local -Password '你的密码'

执行成功后,PowerCLI会返回连接的服务器的信息,包括名称、端口、版本、Uuid等。连接之后,当前PowerShell会话内所有命令都会直接作用于这台vCenter管理的整个环境。

为了安全,我习惯用Connect-VIServer的交互式登录方式,就是先执行Connect-VIServer -Server vcenter.example.com,然后系统会弹出Windows安全登录框输入用户名密码,这样密码不会出现在命令历史记录里。公司环境如果有域认证,还可以用-User domain\username配合Windows集成认证方式。

连接不上的情况很常见,最典型的有三种:

  • 网络不通:vCenter管理网段和你的电脑不在同一个路由里,检查防火墙和路由。
  • 端口不通:vCenter的默认HTTPS端口是443,确认这个端口没有被公司防火墙封禁。
  • 凭据错误:vSphere账号的密码里如果包含特殊字符,在命令行里要用引号包住,或者改用交互登录方式。

3.3 直连ESXi主机与连接vCenter的区别

很多人不知道PowerCLI不仅能连vCenter,还能直接连一台ESXi主机。区别在于:连接vCenter后,你管理的是整个vCenter集群环境里的所有资源;直连ESXi只能操作那一台主机,而且很多vCenter提供的功能,比如DRS、HA、集群级别的操作,在直连ESXi时是看不到的。

直连ESXi的命令:

Connect-VIServer -Server 192.168.1.100 -User root -Password '密码'

直连时用户名通常是root,这个用户名是ESXi本地的管理员账号,而不是vSphere域账号。如果你只是在实验室里测试PowerCLI功能,没有现成的vCenter环境,直连一台ESXi或一台开源的VMware虚拟化环境也完全够用。

这里还要说清楚一个关系:PowerCLI管理的对象是vSphere/ESXi,而不是VMware Workstation。VMware Workstation是桌面级虚拟化软件,跑在个人电脑上;ESXi是服务器级的裸金属虚拟化平台,跑在物理服务器上。两者是不同的产品线,PowerCLI不能直接管理Workstation里的虚拟机,针对Workstation的自动化应该用vmrun工具,这点要区分清楚。

4. 常用命令实操与脚本示例

环境通了之后,接下来就是真正体现PowerCLI价值的环节。这一节我分享几个日常运维中最常用的命令,以及一个批量操作的脚本示例,可以直接抄作业改改就能用。

4.1 查看虚拟机、主机与存储资源

连接vCenter后,把当前环境里的所有虚拟机列出来,只需要一行:

Get-VM | Format-Table Name, PowerState, NumCPU, MemoryGB, Version

这里Get-VM返回的是虚拟机对象,直接输出又长又乱,所以我都会配合Format-TableSelect-Object,只显示关心的字段。想看每台虚拟机的IP地址,用Get-VM | Get-VMGuest取网络信息。

查看ESXi主机和集群的状态:

Get-VMHost | Format-Table Name, ConnectionState, PowerState, Version Get-Cluster | Format-Table Name, HAEnabled, DRSEnabled

查看存储:

Get-Datastore | Format-Table Name, CapacityGB, FreeSpaceGB

这些命令的输出都可以直接导出到CSV文件,用来做资产盘点非常方便:

Get-VM | Select-Object Name, PowerState, NumCPU, MemoryGB | Export-Csv -Path C:\temp\vms.csv -NoTypeInformation -Encoding UTF8

4.2 批量创建快照并输出报告

批量快照是我用得最多的场景。比如有一套业务系统包含10台虚拟机,升级之前需要给每台机器都打一个快照,用图形界面一台一台点真的很烦。PowerCLI写个循环就完了:

$vmNames = @("web-01", "web-02", "mysql-01") $snapshotName = "before-upgrade-20240601" foreach ($vm in $vmNames) { Get-VM $vm | New-Snapshot -Name $snapshotName -Description "Upgrade preparation" }

执行完可以确认一下快照都创建成功:

Get-VM | Get-Snapshot | Where-Object { $_.Name -eq $snapshotName } | Format-Table VM, Name, Created

打快照这个操作在生产环境要小心,尤其是数据库虚拟机,有状态的应用建议跟业务方确认维护窗口再操作,因为快照会让虚拟机处于短暂的内存冻结状态,IO会暂停几秒。

4.3 批量修改虚拟机配置

批量调整配置也是PowerCLI的强项。比如把所有web开头的虚拟机内存从4GB升级到8GB,命令如下:

Get-VM web-* | Set-VM -MemoryGB 8 -Confirm:$false

要注意的是,Set-VM修改在线虚拟机的内存,需要虚拟机里装好了VMware Tools,并且虚拟机电源状态是开机状态才支持热添加,否则会报错或者需要重启生效。所以操作之前先检查状态:

Get-VM web-* | Format-Table Name, PowerState, ToolsVersion

如果Tools版本太老或者没装Tools,最好先安排关机再修改。

4.4 调度任务与vSphere自动化

PowerCLI可以配合Windows任务计划程序定时执行脚本,比如每天晚上自动备份虚拟机快照、定时生成资源利用率报告。我把一个完整的脚本保存为daily_report.ps1,然后在Windows任务计划程序里创建基本任务,触发器选择每天,操作中启动程序填powershell.exe,参数填-File "C:\scripts\daily_report.ps1"

脚本内容类似这样:

Connect-VIServer vcenter.example.com Get-VM | Select Name, PowerState, NumCPU, MemoryGB Disconnect-VIServer -Confirm:$false

定时任务跑出来的结果可以通过邮件发送给管理员。PowerCLI本身没有直接的邮件命令,但PowerShell自带Send-MailMessage或者用.NET的SmtpClient都可以,这个就留给有兴趣的读者自己扩展了。

5. 常见问题与排查技巧实录

把我在实际安装使用过程中踩过的坑集中整理一下,很多问题在网上的文档里不容易直接搜到,但遇到了真的很耽误时间。

5.1 安装模块时报错“无法安装模块”

安装时报错的原因很多,最常见的几个:

  • 未设置TLS 1.2,报错提示下载失败或连接被重置。重新执行[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
  • PowerShell源未被信任,提示需要信任PSGallery。可以手动设置源为信任:
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
  • 公司电脑上配置了代理,PowerShell下载请求走了代理但代理验签失败。在PowerShell 7里可以用-Proxy参数指定代理地址,或者临时关掉系统代理试试。
  • 当前用户对Program Files目录无写权限。这就是我在前面强调用-Scope CurrentUser的原因,当前用户安装会放到用户目录的Modules文件夹里,不需要管理员权限。

5.2 连接时提示“证书不受信任”

这个问题绝大多数情况是没执行Set-PowerCLIConfiguration -InvalidCertificateAction Ignore。还有个办法是在连接时加上-Force参数跳过证书校验:

Connect-VIServer vcenter.example.com -Force

-Force只对当前连接有效,下次还得加,不如直接修改全局配置一劳永逸。需要注意,如果公司有严格的安全审计要求,忽略证书校验的操作可能需要提前报备,因为这会降低连接的安全性。

5.3 命令执行慢或超时

连接成功后,第一条命令总是很慢,这是因为PowerCLI在首次会话中要加载SDK和初始化连接信息,内存占用也会飙升到几百MB,属于正常现象。但如果你每次都慢到不可接受,可以检查是不是vCenter服务器本身负载过高,或者网络延迟太大。

还有一种情况是PowerCLI的WebSession过期了,尤其是长时间不操作后再回来执行命令,会提示session过期,重新执行Connect-VIServer即可。

5.4 与VMware Workstation的使用混淆

这个问题我问过很多同事,大家都有过类似的困惑:装了VMware Workstation Pro,也装了PowerCLI,为什么Connect-VIServer连接不上Workstation里的虚拟机?原因前面说过:PowerCLI管的是vSphere环境,Workstation是桌面级产品。如果你只是学习PowerCLI语法,但没有真实的vCenter环境,可以考虑在Workstation里装一个VMware ESXi的虚拟机来练手,或者使用VMware提供的个人学习环境。这个后面我会单独写一篇教程,这里先埋个伏笔。

5.5 Win10系统优化对PowerCLI的影响

很多人的Windows 10装过各种“优化工具”,关掉了一堆服务,这有可能会影响PowerCLI的运行。最常见的两个问题:

一是Win10系统更新把PowerShell 5.1的.NET版本升级到新版本,但PowerShell 7没有跟随升级,导致某些模块无法加载。解决方式是重新安装PowerShell 7最新版,安装包会自动覆盖旧版本。

二是有些极限优化工具会把“Windows远程管理服务”关掉,虽然PowerCLI本身不依赖WinRM,但PowerShell Gallery模块下载时可能会用到WinRM的一些基础组件,如果下载过程中报错,可以先确认这个服务和WinHTTP服务是否正常运行。这个问题在单位运维的电脑上出现过,排查了半天最后发现是优化工具把WinRM相关的服务禁用了。

6. 一些心得:PowerCLI的学习路径建议

写到最后,分享一点我的实际体会。PowerCLI之所以值得花时间学,是因为它把运维工作从“鼠标点一点”变成了“写一段文本”。你可以把运维经验沉淀成脚本,团队之间共享,也可以结合CI/CD流水线做自动化交付,虚拟机的创建、配置、销毁整个过程都可以用PowerCLI驱动。

我给新手的建议是不要贪多,先掌握最基础的三板斧:Connect-VIServer连上去,Get-VM查虚拟机,Get-VMHost查主机。把这几个命令练熟,能解决实际环境里一半的查询需求,然后用Get-Command -Module VMware.PowerCLI看看它有哪些命令,按需去搜具体参数。官方文档写得很好,但就是太长了,不适合新手从头啃,不如边用边查。

最后再分享一个小技巧:PowerCLI的命令结果本质上是对象,不是文本。你可以随时用Get-Member查看一个对象有哪些属性和方法,比如执行Get-VM | Get-Member就能看到所有可用字段。学会这个方法之后,哪怕遇到一个没接触过的命令,也能快速知道它能输出什么、能继续操作什么,这个习惯是我觉得进阶路上最重要的一点。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询