批处理文件(.bat)等效于类似POSIX的shell脚本(.sh)

时间:2017-03-27 10:28:23

标签: windows batch-file cmd sh glob

我在.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 个答案:

答案 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%"