Пакетный файл (.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%",

Другие вопросы по тегам