Batch file 将环境变量传递给subshell CMD

Batch file 将环境变量传递给subshell CMD,batch-file,gitlab-ci,gitlab-ci-runner,Batch File,Gitlab Ci,Gitlab Ci Runner,我在Windows上的gitlab ci.yml中遇到问题。我使用环境变量启动phpunit。 我有一个变量,比如: PHPUNIT : %SOURCE_PATH%\cgi-bin\php.exe %PHPUNIT_PATH% 一些变量在前面声明: SOURCE_PATH: 'C:\Source' PHPUNIT_PATH: '"%SOURCE_PATH%\cgi-bin\tests\__init\tools\phpunit.phar"' 但是当我使用CALL命令时,Windows不会解析另

我在Windows上的
gitlab ci.yml
中遇到问题。我使用环境变量启动phpunit。
我有一个变量,比如:

PHPUNIT : %SOURCE_PATH%\cgi-bin\php.exe %PHPUNIT_PATH%
一些变量在前面声明:

SOURCE_PATH: 'C:\Source'
PHPUNIT_PATH: '"%SOURCE_PATH%\cgi-bin\tests\__init\tools\phpunit.phar"'
但是当我使用CALL命令时,Windows不会解析另一个变量中的变量

因此,如果我这样做:

CALL Echo %PHPUNIT%
我有:

C:\Source\cgi-bin\php.exe "%SOURCE_PATH%\cgi-bin\tests\__init\tools\phpunit.phar"
我认为这是因为
%SOURCE\u PATH%
调用上下文中不存在

但是我无法找到如何在调用中传递环境变量。我也找不到另一种方法来做这件事。(如果我不使用调用,则当内部脚本退出时,gitlab ci将停止。)

我希望你能帮助我

有些事情需要知道

我的脚本由gitlab cirunner启动,因此它由以下人员启动:

setlocal enableextensions
setlocal enableDelayedExpansion
set nl=^
我不能改变这个


如果需要,或者您知道其他解决方法,我可以使用PowerShell。:)

你的问题不太清楚。。。但是,我可能会猜,您的中间脚本在结尾使用了“Exit”。因此,将其替换为退出


或者尝试使用“开始”而不是呼叫。。。(启动/B…-选中“启动/?”

此批处理文件在执行时演示问题并提供解决方案

@echo off
setlocal EnableExtensions DisableDelayedExpansion
cls
set "SOURCE_PATH=C:\Source"
set "PHPUNIT_PATH="%%SOURCE_PATH%%\cgi-bin\tests\__init\tools\phpunit.phar""
echo %SOURCE_PATH%\cgi-bin\php.exe %PHPUNIT_PATH%
echo/
echo Reference to environment variable SOURCE_PATH in environment
echo variable PHPUNIT_PATH is not expanded on running php.exe.
echo/
echo Solution:
echo/
echo Explicitly set environment variable PHPUNIT_PATH once more with
echo its own value with using additionally the command CALL to expand
echo all variable references inside the variable value.
echo/
call set "PHPUNIT_PATH=%PHPUNIT_PATH%"
echo %SOURCE_PATH%\cgi-bin\php.exe %PHPUNIT_PATH%
echo/
endlocal
pause
通过指定参数
EnableExtensions
EnableDelayedExpansion
来定义命令行环境时,不要多次运行SETLOCAL。只能在运行SETLOCAL时指定这两个选项一次。有关SETLOCALENDLOCAL命令的详细说明,请参阅,这应该清楚说明为什么不建议比实际需要更频繁地运行SETLOCAL


只有当确实需要处理文本中的感叹号或目录/文件名或参数字符串时,才启用延迟扩展。启用延迟扩展后,目录/文件名或参数字符串不再作为文字字符处理。

我无法使用退出/b。。。因为,例如,有时我使用一些工具,如phpunit(因此我不控制代码)。我尝试了“开始”,但同样的问题是,我有一个错误,说%SOURCE\u PATH%\cgi bin\php.exe找不到。我认为,windows解析变量:
%PHPUNIT%=>%SOURCE\u PATH%\cgi bin\php.exe%PHPUNIT\u PATH%
,但在内部,windows不解析变量
%SOURCE\u PATH%
。是的,因为“%PHPUNIT%”不是windows中预定义的变量。%Source\u Path%也是如此。所以,请记住首先使用Set命令定义这些变量。而且,不要忘记使用双引号(“”)来运行路径…如果路径包含空格,即使-CMD gievs有时会出错。是的,我知道,但是gitlab定义(使用set)变量。因此,当我定义%PHPUNIT%时,%SOURCEPATH%存在谢谢。(这是唯一重要的词)