如果你平时要管几台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\ModulesPowerShell 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-VM、New-VM、Set-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-Table或Select-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 UTF84.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就能看到所有可用字段。学会这个方法之后,哪怕遇到一个没接触过的命令,也能快速知道它能输出什么、能继续操作什么,这个习惯是我觉得进阶路上最重要的一点。