为何双击能运行,批处理却报错?
Why a program doesn't work when run from a batch file, but works when clicked
一位客户遇到一个奇怪的问题:程序在双击运行时一切正常,但通过批处理文件启动时却报错。我立刻怀疑是工作目录设置的问题。当你在 Explorer 中双击文件时,系统会自动将程序的当前目录设置为该文件所在的文件夹,以便程序能正确找到相关的辅助文件。然而,如果在批处理文件中直接使用完整路径运行程序,而没有先切换到对应目录,程序就会因为找不到相对路径下的文件而失败。客户最终通过 pushd 和 popd 命令切换目录解决了问题。此外,如果问题依然存在,还可以检查程序是否在 App Paths 中设置了额外的 PATH 环境变量。
当你在 Explorer 中双击一个文件时,Explorer 会将程序的当前目录设置为包含该文件的目录。
HN 评论区
60- netsharc
在使用驱动器盘符时,DOS/Windows 命令提示符有一个很实用的功能(别问我 PowerShell 的事):每个盘符都可以拥有自己的“当前目录”。
所以,如果你把 ffmpeg.exe 放在 C:\Program Files\FFMpeg\bin,源文件在 D:\SourceVideos,想处理这些文件并把输出放到 E:\Output,你可以这样做:
C:(切换到 C 盘)
cd "C:\Program Files\FFMpeg\bin"
E:(切换到 E 盘)
cd D:\SourceVideos(你仍然在 E:\,但 D 盘的“当前目录”已经改变了)。
cd Output(进入 E:\Output)
现在你可以执行 C:ffmpeg.exe -i D:scene1.mp4 output-scene1.mp4
Windows 会访问每个盘符下各自的“当前”目录中的文件。
- tveita
这些客户到底付了多少钱买支持服务,才能让 Raymond Chen 亲自在一阶支持中帮他们调试批处理文件?
- xg15
> Explorer 会将程序的当前目录设置为双击对象所在的目录
我发现那篇链接文章很有启发性,也证实了我的猜想:你“点击的对象”不一定是可执行文件——它也可以是一个文档,而该文档注册了某个可执行文件作为启动处理器;这种情况下,当前目录就是该文档所在的目录。
如果能知道快捷方式和 Shell 命名空间中的项目是如何处理的,应该会很有趣。
- PaulHoule
嗯,explorer.exe 的 UI 中并没有像 CMD.EXE 或 Bash 那样“当前目录”的概念。你可以同时打开多个目录,它们之间互不隶属,没有哪个更特殊。
我想到命令行程序的不同文化:Node 生态非常强调程序“居住”在某个特定目录中,你总是在那个目录里操作该程序。这种方式在很多方面都很方便,但……假设你正在编写一个数据分析程序,想把它放到你的 $PATH 中,然后 cd 到你的数据所在目录并在那里工作呢?
- lordnacho
一个相关的问题是:当你设置自动化脚本时,发现脚本是以不同用户身份运行的,其权限与测试脚本的用户不同。这只是那些试图从“在我机器上能跑”过渡到“真的能跑”时会出现的小麻烦之一。