我正在尝试从gow bash启动.bat文件。我可以成功启动一个批处理并使用以下命令返回bash(我在C:\tmp\a\
目录中),文件a.bat
文件的内容包含一个命令cd
(用于打印当前工作目录):
$ cat a.bat
cd
$ cmd "/C a.bat"
c:\tmp\a>cd
c:\tmp\a
$
现在,如果我尝试从c:\tmp
启动程序(目录结构层次结构中的一级),我会收到错误:
$ cmd "/C a\\a.bat"
'a' is not recognized as an internal or external command,
operable program or batch file.
$ cmd '/C a\a.bat'
'a' is not recognized as an internal or external command,
operable program or batch file.
$ cmd '/C a/a.bat'
'a' is not recognized as an internal or external command,
operable program or batch file.
如何在给定路径的情况下启动批处理脚本,并返回bash?
答案 0 :(得分:1)
我想我找到了一个非常简单的解决方案: 在/ C
之前添加一个点cmd ". /C a\a.cmd"
之后,gow(以及cygwin和alikes)停止将参数视为包含路径并将其转换为POSIX路径。
并且cmd忽略了/ C之前的所有内容(好吧,几乎所有内容,我认为)。
<强> a.cmd 强>:
@echo off
echo it's working
<强>输出强>:
bash-3.1$ cmd ". /C a\a.cmd"
it's working
bash-3.1$
<强> [更新] 强>
经过一番研究后,我发现POSIX path conversion对转换规则有一个非常清晰的描述
在您的情况下,似乎应用了规则An argument with a leading / is converted up to the first /..
转换会导致'\'更改为'/'。因此,您获得a/a.cmd
,即a
,并带有切换/a.cmd
。当然,这会导致观察到的错误。
上面的链接解决了MSYS并且似乎有点过时了,但是我已经从我刚刚安装的Git for Windows安装(基于MSYS2)中检查了bash中的一些规则,它们看起来像所描述的那样工作。
答案 1 :(得分:0)
经过一些研究并向其他论坛发布问题后,我发现以下附加信息“正确”运行作业:
cmd //D . //C "a\a.cmd"
参考文献: