powershell - Windows powershell 中无法识别命令 "docker"

标签 powershell docker

我正在使用 Windows Powershell(在 Windows 10 上)。我也在使用最新版本的docker桌面2.3.0.5。当我在 powershell 中输入“docker version”时,该命令无法识别。错误消息显示“Der angegebenen Datei ist keine Anwendung zugeordnet”。 (英语:没有应用程序分配给指定的文件)。当我包含文件扩展名并输入“docker.exe version”时,可以执行该命令。有趣的是,“docker 版本”可以在 cmd 窗口中运行,但由于某种原因不能在 powershell 中运行。扩展名“.exe”包含在 Windows 环境变量 PATHEXT 中。

它在 powershell 中不起作用的原因可能是什么?

PS:我之前安装过旧版本的docker。那里一切都运转良好。然后我更新到最新版本。之后我就无法再使用现有的 docker 容器了。所以我卸载了旧版本并安装了2.3.0.5版本。从那时起我就遇到了这个问题。

最佳答案

tl;博士:

  • 运行Get-Command -All docker | ForEach-对象路径

  • 在返回的文件路径中,删除那些不以 *.exe 结尾的文件(使用 Remove-Item)。


最可能的解释是,在系统路径 ($env:PATH) 中的一个目录中,位于之前>docker.exe 位于,包含另一个文件,其基本名称docker:

  • 任一:它是一个无扩展名文件,字面意思是完全命名为docker [< em>这就是问题所在]。

    • PowerShell 意外地尝试执行此无扩展名文件,因为它认为该文件是可执行的,尽管根据定义,没有通过 PATHEXT 环境变量指定为可执行文件的扩展名 ($env:PATHEXT)。[1]

      • 这可以解释 cmd.exe 的不同行为,因为它明智地从不考虑无扩展名的文件可执行文件。
    • 据推测,旧版 Docker 的卸载删除了原来的 docker.exe,但在同一目录中留下了一个无扩展名的 docker 文件(可能是 Unix shell 脚本)。

  • 或者:它确实有一个扩展名(*.exe除外),其中:

    • 指的是一个不能直接执行的文件,需要一个解释器 - 一个单独的可执行文件 - 才能执行

    • 并且该扩展名列在 PATHEXT 环境变量中

    • 文件扩展名(例如,.py)和相关解释器(有关的信息)之间的关联(现在)丢失,可能是卸载旧版 Docker 的结果。


[1] 事实上,PowerShell 意外地认为任何文件扩展名可执行 - 请参阅 GitHub issue #12632 .
但是,对于 PATHEXT列出的那些扩展名,只有在文件中包含文件扩展名时,才可以通过路径执行 -仅名称调用(例如,执行 file.txt 会打开一个具有该名称的文件,该文件位于关联编辑器中具有此类文件的路径中的第一个文件夹中)。对于无扩展名的文件,显然没有要包含的扩展名,这就是为什么可能会与具有相同基本名称的 *.exe 文件混淆(除非您调用 .exe);如果这两个文件位于路径中的相同目录中,则*.exe文件优先,但如果无扩展名文件位于列出的不同目录路径中的较早优先。

关于powershell - Windows powershell 中无法识别命令 "docker",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63980371/

相关文章:

docker - 删除docker镜像会影响缓存吗

PowerShell - 减小图像的大小

powershell - powershell-连接N个文本文件,并在每行前添加文件名

powershell - 通过快捷键或命令行/shell 从 Windows 桌面运行 Power Automate 流程

docker - 在Dockerfile中提取gz

linux - 带有 ubuntu 16.04 add-apt-repository 的 Docker 容器使用 groovy 而不是 xenial

powershell - Powershell无法传递命令行字符串参数

.net - 如何在 PowerShell 中更改列表框的字体大小

docker:来自守护进程的错误响应:连接错误:desc = "transport: dial unix:///var/run/docker/containerd/docker-containerd.sock: timeout"

mysql - Docker 上的 Laravel [2002] 连接拒绝端口 3307 上的 Mysql