我在.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'
答案 0 :(得分:1)
linxufan提供了关键指针:
在Windows批处理文件中,shell(cmd.exe
)不自动执行 globbing (扩展文件名模式(通配符)表达式)到匹配文件名列表。)
在Windows上支持globbing的命令(例如dir
)会自己实现 。
相反, literal 字符串*.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%
包含空格或其他shell元字符,则可以使用双引号选项:"--prefix=%PREFIX%"
。