powershell 中比较运算符"-gt"短横的来历
问题:为什么运算符是 -like、‑gt,前面带减号 -,不能直接写 like、gt?
先直接结论:
‑like / ‑gt / ‑eq / ‑match不是普通函数、也不是关键字;它们是 PowerShell 专属的比较运算符标记,开头短横-是语法设计的一部分。
如果你直接写like $a $b,PowerShell不会把它识别成比较,会尝试把like解释成一个命令/程序名,直接报错。
一、先看其它脚本语言做对比
🟢 Bash / Python
Python:a > 5,in;符号或者单词直接作为语言内置关键字。
if name in text:
if x > 10:
🟡 PowerShell 的历史背景(设计者视角)
PowerShell底层是Shell +脚本语言二合一。
Shell的第一要务:命令优先!
PowerShell设计哲学第一条:命令(Cmdlet)优先解析。
任意一串英文单词,解释器优先尝试把它当做一条外部命令、函数、cmdlet去运行。
设想一下,如果设计者把比较运算符直接设计成裸单词:
#【假想的错误语法,并不存在】
if ($x gt 5)
当解析器读到单词gt:
解释器第一反应:gt是不是一个可执行程序?是不是一个函数?是不是cmdlet?
解释器会优先去PATH里面搜索名叫gt的命令。
于是产生歧义!分不清这到底是:
- 一条名叫
gt的外部命令; - 还是脚本语言里面的“大于”比较运算符。
⚠️ 歧义是Shell语言最大的坑。
Shell本来就是用来跑外部程序的;大量简短英文名字的可执行文件随处可见。
如果比较运算符直接使用裸英文单词,随时会和用户写的命令、外部exe重名冲突。
👉 所以设计者选择统一约定:所有这类语言内部运算符,名称前面强制增加短横线‑。
‑gt、‑lt、‑eq、‑ne、‑like、‑match、‑contains。
开头‑就是一个识别标记!告诉解析器:这不是一条命令,这是语言内置运算符!不要去磁盘搜索同名程序。
二、第二点设计:统一风格,和Cmdlet参数保持形式一致
PowerShell cmdlet 的参数全部以短横线开头:
Get‑ChildItem -Recurse -Filter *.txt
Where‑Object -Property Name -like "abc*"
设计者希望整个语言符号视觉统一:
-XXX代表“语言内部标记”:既用于cmdlet的命名参数,也用于运算符。
看到开头横杠,解释器立刻知道:这是语言层面的符号,不是要启动外部命令。
补充历史:PowerShell的前身Monad团队设计的时候刻意放弃了C‑style的
> < ==符号。
为什么不完全用><?
因为>在shell里面已经被占用为重定向输出符号!
dir > out.txt # >是输出重定向!
❗大于符号>已经被shell拿做重定向;小于<用于输入重定向。
所以不能再拿>当做数字大于的比较运算符!
于是只能改用英文单词描述语义:
- greater‑than →
‑gt - less‑than →
‑lt - equal →
‑eq - like(通配符模糊匹配)→
‑like
这就是为什么不用
>,反而要用-gt。
普通编程语言if($a>10);powershell必须写if($a -gt 10)。
三、第三点:语义可读性(面向运维人员,不是C程序员)
微软当时的目标用户是Windows系统管理员(运维),很多人不熟悉编程符号。
用英文缩写单词而不是符号:
‑gt = greater than(大于)
‑lt = less than(小于)
‑like = like(像、模糊匹配)
即使不懂编程,看到单词大概能猜含义;短横‑只是前缀标识。
四、反面演示,试一下去掉横杠会发生什么
如果你故意写,不带横杠:
10 like 8
PowerShell解析:like是命令名称。
它会尝试去找一个叫like.exe的程序,直接报错:
like : 无法将“like”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
完全无法识别成比较运算。
五、顺带提简化语法(Where‑Object简写形式)
$allApps | Where‑Object DisplayName -like "*CUDA*"
这里 -like依然保留减号。即使省略脚本块{}的简化写法,运算符前面的‑不能丢掉。
✨总结,从设计者视角梳理三条核心动机
- 消除Shell解析歧义(最重要)
Shell优先解析单词为外部命令;‑作为前置标记,告诉解释器:这是内置运算符,不要搜索外部exe。避免运算符名字和可执行文件名冲突。 - Shell重定向符号已经抢占了
><
>、<已经用于输出、输入重定向,不能复用做大小比较;改用英文单词缩写形式。 - 语言风格统一 + 面向运维人员可读性
整个环境里面,参数、运算符统一使用‑开头;使用英文缩写,降低运维人员记忆门槛。
补充记忆点:
在PowerShell中,凡是这种用来做条件判断的:‑eq,‑ne,‑gt,‑lt,‑ge,‑le,‑like,‑notlike,‑match,‑notmatch,‑contains,全部必须带前面的短横杠‑。

浙公网安备 33010602011771号