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运算符的用法搞错了:
-contains是用来判断**集合(比如数组)**里是否包含某个元素的,不是用来检测字符串里是否包含子串的,所以用它检查账户名里的$肯定不管用。- 用
-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
相关产品推荐
相关产品推荐

