发现网上的文章里对这个问题大多只是简单给出解决方案,或重启或直接使用
.\
访问命令,没几个深入探讨这个行为背后的原因,蛮写一下好了
知道怎么做只会变成无情的 CV 机器人,知道为什么才能让脑子动起来锻炼编程思维:D
问题描述
使用 PowerShell 执行位于当前目录的命令时会报错:
找不到命令 xxx,但它确实存在于当前位置。默认情况下,Windows PowerShell 不会 从当前位置加载命令。如果信任此命令,请改为键入“.\xxx”。有关详细信息,请参阅 "get-help about_Command_Precedence"。
原因
PowerShell 默认不会从当前位置加载命令,这是基于安全性考虑的一种策略
禁止直接通过运行命令的方式加载当前工作目录的命令,可以有效地防止潜在的安全威胁。原因如下:
-
在执行命令时,如果 PowerShell 自动加载当前位置的命令,那么在一个有恶意意图的环境中,攻击者可以将恶意脚本或可执行文件放置在与合法命令同名的位置上,从而导致用户在不知情的情况下执行命令时,意外加载恶意代码,使得系统受到攻击
通过禁止默认加载当前位置的命令,可以减少这种潜在的安全风险
-
PowerShell 规定,要加载当前位置的命令,用户需要明确指定
.\
前缀这种显式性的设计能够使用户显式认知到他们正在从当前位置加载命令,并且提醒他们对于来自未知来源的脚本或可执行文件要谨慎行事
这种显式指明
.\
前缀的方式鼓励用户更加审慎地处理当前位置的命令,从而尽可能避免不必要的安全风险
解决方法
- 如果是常用命令,建议将其注册到系统环境变量中,在其他位置运行
- 如果是临时需要执行的命令,请根据报错回显加上
./
前缀,如:./cmd