You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell脚本判断运行账户类型(计算机账户/用户账户)失效问题求助

PowerShell脚本判断运行账户类型(计算机账户/用户账户)失效问题求助

我遇到个头疼的问题,想请教下各位:

我有几个脚本是在系统启动、用户登录前运行的,这些脚本是以计算机账户(就是带PC名称的那个账户)执行的。Windows的计算机账户名称最后都会带个美元符号$,所以我写了一段脚本想判断当前是不是计算机账户,如果是的话就执行额外操作,但这段代码死活不工作。

原脚本是这样的:

If ($env:UserName -contains "$") {
    Write-Host "App run from Computer account: $env:UserName. No need to explorer run."
    Write-Host ""
    Write-Host "Set Reboot Active"
        $Global:RebootActive = $True
} Else {
    Write-Host "App run from User Account: $env:UserName. Explorer will be started..."
        Start-Process Explorer
}

问题出在这行:If ($env:UserName -contains "$")
我一开始用-contains没效果,后来换成-match,结果不管是不是计算机账户,脚本都检测到了$,完全没法正确判断。


问题原因&解决方案

其实这里的核心是PowerShell运算符的用法搞错了:

  1. -contains是用来判断**集合(比如数组)**里是否包含某个元素的,不是用来检测字符串里是否包含子串的,所以用它检查账户名里的$肯定不管用。
  2. 用-match的时候,$在正则表达式里是表示“行尾”的特殊符号,而且双引号里的$会被PowerShell当成变量解析,导致实际匹配的是空字符串,自然所有账户都会被误判。

给你两种正确的写法:

方法一:用-like通配符匹配(推荐,简单直观)

-like是PowerShell专门用来做简单字符串匹配的,用通配符*表示任意字符,*$就能精准匹配以$结尾的账户名:

If ($env:UserName -like "*$") {
    Write-Host "App run from Computer account: $env:UserName. No need to explorer run."
    Write-Host ""
    Write-Host "Set Reboot Active"
    $Global:RebootActive = $True
} Else {
    Write-Host "App run from User Account: $env:UserName. Explorer will be started..."
    Start-Process Explorer
}

方法二:用-match并正确转义

如果非要用正则表达式的话,需要转义$(用\$),同时用单引号包裹正则表达式,避免PowerShell解析变量:

If ($env:UserName -match '\$$') {
    Write-Host "App run from Computer account: $env:UserName. No need to explorer run."
    Write-Host ""
    Write-Host "Set Reboot Active"
    $Global:RebootActive = $True
} Else {
    Write-Host "App run from User Account: $env:UserName. Explorer will be started..."
    Start-Process Explorer
}

这里\$$的意思是:匹配字符串结尾的$符号,这样就能准确识别计算机账户了。


备注:内容来源于stack exchange,提问作者MikeZetPL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 10:13:13