从同一个批处理文件读取第一行?
我有一个批处理文件,它尝试运行文件第一行指定的程序。这有点像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 个回答
Shebang(也叫做“井号”)只在Unix/Linux/BSD这些系统的文件中有用。这是因为这些系统的设计和结构使得文件系统能够识别以shebang开头的文件。当文件以shebang开头时,文件系统会自动让用户的终端去调用相应的shell,通常是/bin/sh
。你可以通过查看文件系统的相关代码来确认这一点,具体可以参考这里。
编辑:我更新了我的回答,以便在Windows环境下更清楚地说明。
简单来说,在Windows系统(从2000版到Windows 7)中,这是不可能的,因为NTFS文件系统没有能力去理解文件里的内容(NTFS并不关心文件里面是什么),因此也无法像Unix那样通过exec
调用来加载shebang脚本。Windows只支持.EXE、.DLL、.SYS和.DRV这些文件类型,但对于脚本文件就不行了……
希望这能帮到你,祝好,
汤姆。
首先,在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