批处理文件 (.bat) 相当于 POSIX-like shell 脚本 (.sh)

Batch file (.bat) equivalent to a POSIX-like shell script (.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'

linxufan提供了关键指针:

在 Windows 批处理文件中,shell (cmd.exe) 不会 自动执行 globbing(将文件名模式(通配符表达式)扩展为匹配文件名列表)。
支持 Windows 通配符的命令,例如 dir 自己实现

相反,literal string *.egg 被传递给你的目标程序,这显然不是这里的意图。

因此,您必须进行自己的通配,并将结果传递给目标程序。

但是,在批处理文件中 稳健地 这样做很棘手;以下工作假设您的文件名既没有 embedded " 也没有 ! 字符:

@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 是必需的,因此您可以在 for 循环中迭代地构建 %files% 变量(然后 !...!-封闭的变量引用动态 扩展)-缺点是 ! 个字符。在变量的[​​=42=]value中也被解释。

  • 为了正确处理带有嵌入 空格 的文件名,每个文件名都添加了包含 " 个字符。 - 缺点是文件名嵌入了 " 个字符。不会被正确处理,但这种情况很少见。

请注意,如果 %PREFIX% 有可能包含空格或其他 shell 元字符,请将选项传递给双引号:"--prefix=%PREFIX%".