如何从Cygwin调用bat / cmd文件并继承变量?

时间:2019-02-02 19:26:28

标签: bash batch-file cmd cygwin

假设我有一个bat(或cmd)脚本来设置环境变量:

rem set_foo.bat
SET foo=XXX

我想从Cygwin bash脚本调用该脚本,以使Cygwin bash脚本可以看到set_foo.bat设置的变量。也就是说,此Cygwin bash脚本:

#!/bin/sh
<call set_foo.bat in such a way that FOO becomes visible to this Cygwin script>
echo FOO is ${FOO}

应打印:

FOO is XXX

这有可能吗?

PS 1:我知道这里提出的解决方案:cygwin environment variables set in bat file,而这些并不是我想要的。

PS 2:bat脚本不受我的控制(Cygwin bash脚本受我控制),因此任何涉及调整bat脚本的解决方案都是不可接受的。

PS 3:如果我只是从Cygwin bash脚本中像这样调用set_foo.bat

#!/bin/sh
set_foo.bat
echo FOO is ${FOO}

然后FOO的值不可见。也就是说,Cygwin bash脚本将打印:

FOO is 

2 个答案:

答案 0 :(得分:2)

尝试一下:

#!/bin/sh

export $(cmd /c "set_foo.bat & set foo" | grep "^foo=")
echo Foo is $foo

只要set_foo.bat不在%foo%范围内设置setlocal的值,该值应保留到{{1 }}解释的命令。这将输出variable = value对,& set foo将其解释为本地变量分配。

答案 1 :(得分:0)

这是一个简单的工作示例。制作一个cygwin shell脚本(使用LF进行EOL)

:
# runner.sh
cmd=/cygdrive/c/Windows/system32/cmd.exe
$cmd /C wrapper.bat
diff env0.txt env1.txt | dos2unix | sed -e '/[0-9]/d' -e '/^> /s/> //'

和一个cmd脚本(CR / LF用于EOL)

@rem wrapper.bat
@set > env0.txt
@call .\set_foo.bat
@set > env1.txt

和原始cmd文件的替代(也具有CR / LF用于EOL)

@rem set_foo.bat
@set FOO=BAZ

从外壳执行./runner.sh将显示set_foo.bat cmd文件设置的环境变量。只要该文件不使用setlocal命令,您就会在wrapper.bat中看到所有环境更改。这应该正确显示新的环境变量。处理删除或更改留给读者作为练习,同样传递参数。

HTH