如何在PowerShell脚本中检测运行环境:普通PowerShell窗口还是Exchange Management Shell
检测PowerShell脚本运行环境:普通窗口 vs Exchange Management Shell
当然有办法区分这两种环境!我平时处理这类脚本兼容性需求时,常用下面几个靠谱的方法,你可以根据自己的场景选最合适的:
方法1:检查Exchange专属的管理单元/模块
Exchange Management Shell(EMS)启动时会自动加载Exchange的PowerShell管理单元或模块,普通PowerShell窗口默认不会加载。你可以通过以下代码检测:
针对较旧Exchange版本(依赖管理单元)
$isEms = Get-PSSnapin -Name Microsoft.Exchange.Management.PowerShell.SnapIn -ErrorAction SilentlyContinue if ($isEms) { Write-Host "当前在Exchange Management Shell中运行" } else { Write-Host "当前在普通PowerShell窗口中运行" }
针对较新Exchange版本(依赖模块)
$isEms = Get-Module -Name ExchangeOnlineManagement -ErrorAction SilentlyContinue # 或者检查本地Exchange模块 $isEmsLocal = Get-Module -Name Microsoft.Exchange.Management.PowerShell.* -ErrorAction SilentlyContinue if ($isEms -or $isEmsLocal) { Write-Host "当前在Exchange Management Shell或已加载Exchange模块的PowerShell环境中运行" } else { Write-Host "当前在普通PowerShell窗口中运行" }
方法2:检查Exchange专属环境变量
EMS会自动设置几个特定的环境变量,比如Exchange安装路径,普通PowerShell里不会有这个变量:
if ($env:ExchangeInstallPath) { Write-Host "当前在Exchange Management Shell中运行" } else { Write-Host "当前在普通PowerShell窗口中运行" }
你也可以检查$env:PSModulePath里是否包含Exchange模块的路径,不过上面的方法更直接。
方法3:尝试执行Exchange专属命令
如果上面的方法不够准确,你可以尝试执行一个只有EMS里才有的命令(比如Get-Mailbox),通过是否报错来判断:
try { # 执行一个无副作用的Exchange命令 Get-Mailbox -ResultSize 1 -ErrorAction Stop | Out-Null Write-Host "当前在Exchange Management Shell中运行" } catch { Write-Host "当前在普通PowerShell窗口中运行" }
引导用户切换环境
如果检测到用户在普通窗口运行,你可以提示他们切换到EMS,甚至可以直接在脚本里帮用户启动EMS连接(针对本地Exchange):
if (-not $env:ExchangeInstallPath) { Write-Warning "请在Exchange Management Shell中运行此脚本!" Write-Host "你可以:" Write-Host "1. 从开始菜单打开Exchange Management Shell" Write-Host "2. 或者在当前窗口执行以下命令加载Exchange环境:" Write-Host "& `$env:ExchangeInstallPath\bin\RemoteExchange.ps1; Connect-ExchangeServer -auto" exit 1 }
内容的提问来源于stack exchange,提问作者Keith Langmead
相关产品推荐
相关产品推荐

