将环境变量传递给子shell CMD

Pass environment variables to subshell CMD

我在 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_PATH%CALL 上下文中不存在。

但我找不到如何在 CALL 中传递环境变量。而且我也找不到另一种方法来做到这一点。 (如果我不使用 CALLgitlab-ci 在内部脚本退出时停止。)

希望你能帮助我...

要知道的事情。

我的脚本是由gitlab-ci runner 启动的,所以它是由:

启动的
setlocal enableextensions
setlocal enableDelayedExpansion
set nl=^

我无法改变这一点。

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

您的问题不太清楚...但是,我可能会猜到 - 您的中间脚本在末尾使用“Exit”。所以,将其替换为 Exit /B

或尝试使用 'Start' 而不是 调用... (Start /B . .. - 检查'Start /?')

此批处理文件演示了执行时出现的问题并提供了解决方案。

@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

不要运行 SETLOCAL 多次使用指定参数EnableExtensionsEnableDelayedExpansion 来定义命令行环境。两者都只能在 运行ning SETLOCAL 上指定一次。有关命令 SETLOCALENDLOCAL 的详细说明,请参阅 ,这应该清楚说明为什么不建议 运行 SETLOCAL 比真正需要的更频繁。

并且仅在真正需要时才启用延迟扩展,因为要处理的文本中的感叹号或 directory/file 名称或参数字符串不再作为启用延迟扩展的文字字符处理。