从同一批处理文件中读取批处理文件的第一行?
我有一个批处理文件,它尝试运行第一行指定的程序。类似Unix的shebang:从同一批处理文件中读取批处理文件的第一行?
C:\> more foo.bat
#!C:\Python27\python.exe
%PYTHON% foo-script.py
C:\>
我想知道的是:有没有办法来自动设置%PYTHON%
到C:\Python27\python.exe
这是在家当(#!
)以下脚本的第一行中指定?
背景:我想这样做,以便明确指定Python解释器在包装脚本中调用(因为系统上安装了多个Python解释器)。
假设:你可以假设脚本已经知道它自己的文件名(foo
)和%~dp0
是这个脚本的目录。我们如何阅读不包括shebang的第一行?
澄清:将C:\ PythonXY添加到%PATH%不是解决方案。 shebang行应该在安装期间被修改(原始脚本仅在构建机器上生成)在用户的机器上..可能有多个相同版本的Python安装。只有shebang行是可修改的(这是程序的工作原理)。
首先,在windows上,没有必要使用shebang。最好将Python解释器的路径包含到运行脚本的用户的PATH环境变量中。这就是说,要获得批量的第一行,你可以使用设置
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
要添加到PATH,请参阅我最近在问题中添加的说明。 – 2010-01-27 01:34:55
呃,我刚刚意识到'#!'不是注释,而是批处理文件中无效的语法。整个想法已经崩溃。 – 2010-01-27 01:37:28
但是,我至少可以使用rem#!
Shebangs只有本土的Unix/Linux/BSD变体的文件系统,由于其设计和布局,文件系统知道当一个文件以shebang开头时,文件系统会触发用户的终端进程来调用基于shebang的shell,通常为/bin/sh
。这可以通过浏览文件系统例程here来确认。
编辑:编辑过我的答案,以便在Windows环境中充分说明问题。
总之,在Windows(2000以上到Windows 7)下这是不可能的,因为NTFS缺乏解释数据内容的能力(NTFS不关心文件中的内容),因此缺乏方法具有一个exec
调用来加载认领脚本,只有.exe,.dll,.SYS,.DRV的被照顾,但一个脚本....
希望这有助于 最好的问候, 汤姆。
请注意,setuptools/Distribute已经使用shebang来模拟Windows上的exe包装。 'foo.exe'调用'foo-script.py'中指定的shebang解释器。 http://packages.python.org/distribute/setuptools.html#automatic-script-creation – 2010-01-27 02:44:06
@ tommieb75,shebang与文件系统无关;如果你有一个保存在FAT32或NTFS文件系统中的shebang脚本,但是你可以从可以读取FAT32或NTFS的UNIX变体中执行它,那么该命令仍然可以工作 - 关键在于操作系统如何实现“exec”和朋友,而不是文件系统。 – 2010-01-27 05:16:29
@Michael:引用你的评论'如果你有一个保存在FAT32或NTFS文件系统上的shebang脚本,但是你可以从可以读取FAT32或NTFS的UNIX变体中执行它,那么该命令仍然可以工作' - 你的答案!!!!这意味着它可以在Linux/BSD版本下运行,当然它可以工作,因为NTFS/FAT32分区将被挂载,并且fs会知道如何处理shebang!我的答案是在Windows环境和NTFS环境下的! – t0mm13b 2010-01-27 12:46:29
为什么不把C:\ Python27添加到Windows PATH环境变量? – Yada 2010-01-27 01:20:12
@Yada:C:\ Python27已经在PATH中;但是,C:\ Python25,C:\ Python26,C:\ Python31等也是如此。此外,该脚本的shebang将在安装期间被*修改*。 – 2010-01-27 01:24:26