Прочитать первую строку командного файла из того же командного файла? - PullRequest
1 голос
/ 27 января 2010

У меня есть командный файл, который пытается запустить программу, указанную в первой строке. Подобно shebang * Unix's :

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

То, что я хочу знать: есть ли способ автоматически установить %PYTHON% в C:\Python27\python.exe, который указан в первой строке скрипта после шебанга (#!)?

Справочная информация : я пытаюсь сделать это, чтобы явно указать интерпретатор Python для вызова (так как в системе установлено несколько интерпретаторов Python) в сценарии оболочки.

Предположение : Вы можете предположить, что скрипт уже знает свое имя (foo), а %~dp0 является каталогом этого скрипта. Как мы читаем первую строку, исключая шебанг?

Уточнение : Добавление C: \ PythonXY в% PATH% не является решением. Предполагается, что строка shebang будет изменена во время установки (исходный скрипт генерируется только на компьютере сборки) на компьютере пользователя, который может иметь несколько установок Python одной и той же версии. И только строка Шебанга может быть изменена (так работает программа).

Ответы [ 2 ]

4 голосов
/ 27 января 2010

Во-первых, на окнах нет необходимости в шебанге. Лучше всего включить путь интерпретатора Python к переменной среды PATH пользователя, который запускает сценарий. Тем не менее, чтобы получить первую строку в пакете, вы можете использовать set

set /p var=<file

поскольку у вас несколько версий интерпретатора, почему бы просто не использовать правильную версию при вызове сценария?

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

Edit:

@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
0 голосов
/ 27 января 2010

Shebangs являются родными только для файловых систем вариантов Unix / Linux / BSD, так как благодаря их структуре и расположению файловая система знает, что, когда файл начинается с Shebang, файловая система запускает процесс терминала пользователя для запуска оболочки на основе Шебанг, обычно /bin/sh. Это можно подтвердить просмотром подпрограмм файловой системы здесь .

Редактировать: Отредактировал мой ответ, чтобы он был полностью понятен в контексте среды Windows.

Короче говоря, это невозможно в Windows (с 2000 года и старше до Windows 7), так как NTFS не имеет такой возможности для интерпретации содержимого данных (NTFS не волнует, что находится в файле), и, следовательно, отсутствуют средства при вызове exec для загрузки сценария shebang обрабатываются только .EXE, .DLL, .SYS, .DRV, но для сценария ....

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...