我正在开发一个便携式建筑框架。在 Linux 上,该框架完美运行。但是在 Windows 上,框架不能执行脚本:Windows 只允许*.exe
运行*.com
。
问题:是否有可执行文件(*.exe
或*.com
):
- 读取具有相同文件名的文件,但
.exe
扩展名 (bar.py.exe
->bar.py
) - 在同一目录 (
C:\dir\bar.py.exe
->C:\dir\bar.py
)上搜索此文件 - 解析文件的shebang (
bar.py
->#!/usr/bin/python
) - 执行解释器 (
python
) - 传递脚本的名称(
C:\dir\bar.py
或/c/dir/bar.py
或/cygdrive/c/dir/bar.py
) - 也传递它的命令行参数
我不知道如何找到这样的项目......
下面有更多细节可以更好地理解我的问题。
细节:
我的构建框架是基于Ant的:
<target name="repo.init">
<exec executable="repo" dir="${dir}">
<arg value="init" />
<arg value="-u" />
<arg value="${url}" />
</exec>
</target>
在 Windows 上,Ant (java) 找不到可执行文件repo
。
我不想仅仅因为 Windows 而弄乱 Ant 脚本:
<target name="repo.init">
<exec executable="python" dir="${dir}">
<arg value="repo" />
<arg value="init" />
<arg value="-u" />
<arg value="${url}" />
</exec>
</target>
因此,我尝试了一个运行 python 脚本的批处理脚本:
$ dir
2013-09-23 10:30 738 repo
2013-09-23 10:31 23 repo.bat
$ type repo.bat
python %~dp0/repo %*
但是同样的错误!我的同事指定cmd
他何时从 Ant 运行批处理文件:(
<target name="repo.init">
<exec executable="cmd" dir="${dir}">
<arg value="/c" />
<arg value="repo.bat"/>
<arg value="init" />
<arg value="-u" />
<arg value="${url}" />
</exec>
</target>
由于我的问题在混合外部脚本的各种项目中很常见,我想知道是否已经实施了一个优雅的解决方案......
我们可以使用与脚本同名的可执行文件。运行此可执行文件时,它会读取位于同一目录中的脚本,解析shebang并使用指定的解释器执行此脚本。
演示:
C:\dir> dir
Volume in drive C is OSDisk
Volume Serial Number is 56A4-E980
Directory of C:\dir
23/09/2013 17:19 <DIR> .
23/09/2013 17:19 <DIR> ..
23/09/2013 17:15 23 535 repo
23/09/2013 17:25 89 521 repo.exe
2 File(s) 113 056 bytes
2 Dir(s) 122 670 903 296 bytes free
C:\dir> head -1 repo
Unknown option: 1
[...]
C:\dir> powershell -command "& {get-content repo -totalcount 1}"
#!/usr/bin/env python
C:\dir> repo.exe arg1 arg2
[... --> execute "python C:\dir\repo arg1 arg2" ...]
这很容易实现(例如使用CreateProcess()
)。但我更愿意重用已经开发的类似工具。
我对解决这个问题的任何其他想法持开放态度......