从同一个批处理文件读取第一行?

1 投票
2 回答
1228 浏览
提问于 2025-04-15 18:31

我有一个批处理文件,它尝试运行文件第一行指定的程序。这有点像Unix系统中的shebang(一种特殊的注释)。

C:\> more foo.bat
#!C:\Python27\python.exe
%PYTHON% foo-script.py
C:\>

我想知道有没有办法自动%PYTHON%设置为C:\Python27\python.exe,这个路径是在脚本第一行的shebang后面指定的(#!)?

背景:我这样做是为了明确指定要调用的Python解释器(因为系统上安装了多个Python解释器)在这个包装脚本中。

假设:你可以假设这个脚本已经知道自己的文件名是foo,并且%~dp0是这个脚本所在的目录。我们该如何读取第一行内容,但不包括shebang呢?

说明:把C:\PythonXY添加到%PATH%并不是解决办法。shebang行应该在安装时进行修改(原始脚本只在构建机器上生成),而用户的机器上可能有多个相同版本的Python安装。并且只有shebang行是可以修改的(这就是程序的工作方式)。

2 个回答

0

Shebang(也叫做“井号”)只在Unix/Linux/BSD这些系统的文件中有用。这是因为这些系统的设计和结构使得文件系统能够识别以shebang开头的文件。当文件以shebang开头时,文件系统会自动让用户的终端去调用相应的shell,通常是/bin/sh。你可以通过查看文件系统的相关代码来确认这一点,具体可以参考这里

编辑:我更新了我的回答,以便在Windows环境下更清楚地说明。

简单来说,在Windows系统(从2000版到Windows 7)中,这是不可能的,因为NTFS文件系统没有能力去理解文件里的内容(NTFS并不关心文件里面是什么),因此也无法像Unix那样通过exec调用来加载shebang脚本。Windows只支持.EXE、.DLL、.SYS和.DRV这些文件类型,但对于脚本文件就不行了……

希望这能帮到你,祝好,
汤姆。

4

首先,在Windows系统上,不需要使用shebang(那种在脚本第一行的特殊标记)。最好是把Python解释器的路径添加到运行脚本的用户的PATH环境变量中。也就是说,如果你想在批处理文件中获取第一行,可以使用set命令。

set /p var=<file

既然你有多个版本的解释器,为什么不在调用脚本时直接使用正确的那个呢?

c:\python27\bin\python.exe myscript.py

编辑:

@echo off
set /p var=<test.py
call %var:~2% test.py

输出

C:\test>more test1.py
#!c:\Python26\python.exe

print "hello"


C:\test>more test.bat
@echo off
set /p var=<test1.py
call %var:~2% test1.py

C:\test>test.bat
hello

撰写回答