Пакетный файл (.bat) эквивалентен POSIX-подобному сценарию оболочки (.sh)
У меня есть эта строка в .sh
файл: easy_install -Z --prefix=$PREFIX *.egg
Сейчас я работаю в Windows и перевел эту команду на то, что я считаю эквивалентной командой пакетного файла:
easy_install -Z --prefix=%PREFIX% *.egg
Тем не менее, я получаю следующую ошибку (с %PREFIX%
содержащий c:\path\to\site-packages
):
Creating C:\path\to\site-packages\site.py
error: Not a URL, existing file, or requirement spec: '*.egg'
1 ответ
linuxfan предоставил ключевой указатель:
В пакетных файлах Windows оболочка (cmd.exe
) автоматически не выполняетподстановку(расширение шаблонов имен файлов (подстановочных выражений) в список совпадающих имен файлов).
Команды, которые поддерживают глобализацию в Windows, такие какdir
Внедрите этосами.
Вместо этого буквенная строка*.egg
передается вашей целевой программе, которая здесь явно не предназначена.
Таким образом, вы должнывыполнить свою собственную обработку и передать результат целевой программе.
Однако сделать это надежно в командном файле довольно сложно; следующее работает в предположении, что ваши имена файлов не имеют"
ни !
символы:
@echo off
setlocal enabledelayedexpansion
:: Do your own globbing and collect the filenames in variable %files%.
set "files="
for %%f in (*.egg) do set files=!files! "%%f"
easy_install -Z --prefix=%PREFIX% %files%
setlocal enabledelayedexpansion
необходимо, чтобы вы могли создать%files%
переменная итеративно вfor
цикл (!...!
-замкнутые ссылки на переменные затем динамически расширяются)!
символы. в значение переменной также интерпретируются.Чтобы правильно обрабатывать имена файлов со встроенными пробелами, каждое имя файла добавляется с
"
символы. - недостатком является то, что имена файлов со встроенными"
символы. не будет обработан правильно, но это редко.
Обратите внимание, что если есть шанс, что %PREFIX%
содержит пробелы или другие метасимволы оболочки, передайте параметр в двойных кавычках: "--prefix=%PREFIX%"
,