【问题标题】:Running a .bat script under Cygwin bash在 Cygwin bash 下运行 .bat 脚本
【发布时间】:2014-07-18 18:33:39
【问题描述】:

我想在 Cygwin bash shell 下使用现有的 DOS/Windows .bat 脚本。 .bat 脚本创建了许多变量,这些变量需要在 .bat 脚本结束后存在。

这可行,但变量不保留。

$ ./.phs_project_setup.bat .

这似乎并没有扩展到采购 .bat 脚本,因此它创建的变量仍然存在于环境中。

$ . ./.phs_project_setup.bat .
-bash: @ECHO: command not found
-bash: SET: command not found
-bash: $'\r': command not found
-bash: REM: command not found

对克服这个障碍有什么想法吗?

【问题讨论】:

  • 请记住,Unix 系统通常区分大小写。 cygwin 的 bash 可以直接运行 windows 可执行文件,但它仍然区分大小写。 SET 不是有效的 bash 命令,而 set 是。

标签: bash shell cygwin


【解决方案1】:

我所做的是将环境写入文件,然后在每个值上使用 'cygpath -u' 对文件进行迭代。也许我错过了一些,但似乎 cygpath 只会改变实际上看起来像一条路径的东西。例如,它不会更改 Oracle 连接字符串; “用户/通行证@DB”。我在每行的开头添加了“export”,以便可以将其引入 bash shell。这还不是一步,但更好。

【讨论】:

    【解决方案2】:

    请记住,Unix 系统通常区分大小写。 cygwin 的 bash 可以直接运行 windows 可执行文件,但它仍然区分大小写。 SET 不是有效的 bash 命令,而 set 是。

    您可以强制它获取文件并尝试运行它,但它只能运行与 cmd 命令具有 1:1 名称对应关系的 shell 内置命令。所以set 有效,但@echo 不会,因为@ 没有什么可抨击的。 rem 也是如此。

    【讨论】:

    • 脚本在这两种情况下都是同一个文件。在第一种情况下,bash 似乎愿意踢 cmd.exe 来运行脚本。但是,在使用 'source' 或 '.' 的情况下。 bash 不会启动 cmd.exe。
    • bash 在获取脚本时从不调用 any 其他程序;它在 current shell 中运行。
    【解决方案3】:

    我建议尝试使用批处理解释器(也称为 COMSPEC 环境变量,它只是 CMD)运行批处理脚本,然后回显它设置的环境,如本问题所示:How I can use PowerShell with the Visual Studio Command Prompt?

    然后您可以尝试以类似的方式设置环境。请注意,您可能对斜线、驱动器名称和其他类似内容的方向有疑问

    【讨论】:

    • 是的,很多变量都是文件路径,在bash启动时不会自动转换。这就是问题的一半。另一半是让它们保留在 bash shell 中。
    【解决方案4】:

    听起来你需要运行批处理文件,然后启动 cygwin。如果是这样,请从您使用的任何文件(例如 cygwin.bat)中调用批处理文件来启动 cygwin。然后变量应该可用。

    另外,我还将所需的位移动到正确的 unix 配置文件中以实现相同的结果。

    【讨论】: