【问题标题】:System cannot find path even though it exists in paths即使路径中存在路径,系统也找不到路径
【发布时间】:2019-12-17 11:20:33
【问题描述】:

处理调用另一个批处理文件的批处理文件。

K:\Market Risk>call "K:\Market Risk\activate.bat"
The system cannot find the path specified.

所以我在批处理文件的开头设置了路径并确保它在那里:

SET PATH=%PATH%;K:\Market Risk\

K:\Market Risk>echo %PATH%
C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;
C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;
C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\Shoreline Communications\
ShoreWare Client\;C:\Program Files\dotnet\;C:\Program Files (x86)\Microsoft SQL Server
\150\DTS\Binn\;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;
C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\
WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\
Shoreline Communications\ShoreWare Client\;C:\Program Files (x86)\Common Files\Oracle\
Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;
C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;
C:\Program Files (x86)\Shoreline Communications\ShoreWare Client\;
C:\Users\Kyle.Dixon\AppData\Local\Microsoft\WindowsApps;C:\Users\Kyle.Dixon\AppData\Local\
Programs\Git\cmd;C:\Users\Kyle.Dixon\AppData\Local\atom\bin;C:\Users\Kyle.Dixon\Documents\
R\R-3.5.2\bin\R.exe;C:\Users\Kyle.Dixon\Documents\R\R-3.5.2\bin;C:\Users\Kyle.Dixon\
AppData\Roaming\MarketView\MarketView ExcelTools\;K:\Market Risk\

但是,我仍然遇到同样的错误:

K:\Market Risk>call "K:\Market Risk\activate.bat"
The system cannot find the path specified.

以前有人遇到过这个问题吗?

【问题讨论】:

    标签: windows batch-file cmd path


    【解决方案1】:

    我推荐阅读What is the reason for "X is not recognized as an internal or external command, operable program or batch file"?它应该有助于理解环境变量PATH是如何被Windows管理的。不幸的是,Windows 管理得并不好,这会导致很多问题,因为没有命令可以安全地添加/删除 systemuser PATH 的文件夹路径。缺少 Microsoft 编写的此类命令或可执行文件以安全更新 PATH 并应用所有必要的错误检查的结果是很多不好的编码脚本经常损坏 systemuser PATH 在尝试更新它们时存储在 Windows 注册表中。

    我的建议是以管理员身份打开 Windows 控制面板 - 系统 - 高级系统设置 - 环境变量 并清理 Path 环境变量,用户 Path (上窗格)和 系统 Path(下窗格)如下:

    • 系统 Path 应始终以以下默认 Windows 文件夹路径开头:
      • %SystemRoot%\System32
      • %SystemRoot%
      • %SystemRoot%\System32\Wbem
      • %SystemRoot%\System32\WindowsPowerShell\v1.0\
      • %SystemRoot%\System32\OpenSSH\

      如果 system Path 不再以此处所写的这些文件夹路径开始,则它过去曾被严重更新过一次。 (最后一个文件夹路径仅在 Windows 10 版本 1809 之后可用。)C:\WINDOWS 存储在 Windows 注册表中并在编辑 系统 时显示 Path 而不是 %SystemRoot% 表示安装程序可执行文件或脚本没有很好地更新 system Path,因为用扩展版本引用环境变量 SystemRoot 替换了原始文件夹路径。这对这些文件夹路径并不重要,但可能对其他文件夹路径有害。
    • 在两个Path 环境变量之一中,文件夹路径不应存在多次。
      删除 user Path 以及 system Path 中的所有重复项。

      您的两个 Path 环境变量包含三个时间:
      • C:\Program Files (x86)\Common Files\Oracle\Java\javapath
      • C:\Program Files (x86)\Shoreline Communications\ShoreWare 客户端\
      • C:\WINDOWS
      • C:\WINDOWS\system32
      • C:\WINDOWS\System32\OpenSSH\
      • C:\WINDOWS\System32\Wbem
      • C:\WINDOWS\System32\WindowsPowerShell\v1.0\

      system Path 中已存在的文件夹路径不应在 user Path 中再次存在,当然在 system中也不应再次存在> Path.
    • 可以在Path 中列出不带或带反斜杠的文件夹路径。我更喜欢在Path 末尾没有反斜杠的文件夹路径,因为这会减少将来在通过批处理脚本使用命令reg 时更新Path 的麻烦。
    • 环境变量Path 应该只包含文件夹路径而不是完全限定的文件名。
      所以C:\Users\Kyle.Dixon\Documents\R\R-3.5.2\bin\R.exePath 中完全是一派胡言。

    清理Path 两个环境变量后,system Path 中的文件夹路径应类似于:

    • %SystemRoot%\system32
    • %SystemRoot%
    • %SystemRoot%\System32\Wbem
    • %SystemRoot%\System32\WindowsPowerShell\v1.0\
    • %SystemRoot%\System32\OpenSSH\
    • %CommonProgramFiles(x86)%\Oracle\Java\javapath
    • %ProgramFiles(x86)%\Microsoft SQL Server\150\DTS\Binn
    • %ProgramFiles(x86)%\Shoreline Communications\ShoreWare 客户端
    • C:\Program Files\dotnet

    对于最后一条路径,最好保留C:\Program Files,不要使用%ProgramFiles%,除了C:\Program Files\dotnetC:\Program Files (x86)\dotnet 我不知道,因为我没有这样的目录视窗电脑。原因请参见 Microsoft 文档页面 WOW64 Implementation Details

    用户 Path 最终应该是这样的:

    • %LocalAppData%\atom\bin
    • %LocalAppData%\Microsoft\WindowsApps
    • %LocalAppData%\Programs\Git\cmd
    • %AppData%\MarketView\MarketView ExcelTools
    • %UserProfile%\Documents\R\R-3.5.2\bin

    关于执行这两个批处理文件的环境没有太多的文章。所以下面写的大部分都是纯粹的推测。

    我认为驱动器K: 不是本地硬盘上的驱动器,而是网络驱动器。因此,可能是由于网络资源未映射到驱动器号 K: 或存在网络连接问题或网络资源权限问题,映射到驱动器 K: 的网络资源当前不可用。

    Windows 将网络资源重新映射到驱动器号,就像用户仅在用户登录时所做的那样,因为网络驱动器映射是 Windows 注册表中存储的与用户帐户相关的用户帐户。因此,如果批处理文件作为计划任务使用不同的帐户或在未登录的用户上执行,则驱动器K: 确实不存在。执行批处理文件的计划任务必须配置为使用具有访问批处理文件访问的所有网络资源和本地目录/文件的必要权限的帐户。此外,还需要使用其 UNC 路径访问网络资源上的文件和文件夹,而不是使用在此环境中执行批处理文件时不存在的网络驱动器的驱动器号 K:

    另见:What must be taken into account on executing a batch file as scheduled task?

    但也可能是错误信息

    系统找不到指定的路径。

    cmd.exe 在处理包含命令行的批处理文件时不输出

    call "K:\Market Risk\activate.bat"
    

    但在处理批处理文件K:\Market Risk\activate.bat时执行的命令行。

    因此我建议从顶部的两个批处理文件中删除@echo off 或将其更改为@echo on 并从命令提示符窗口中运行主批处理文件,请参阅debugging a batch file。然后应该 100% 清楚哪个批处理文件中的哪个命令行导致此错误消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-10
      • 2018-07-15
      • 2019-02-27
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多