5

查看以下命令:为什么 a 的值在 ? 之后不可用&

C:\>set a=

C:\>set a=3&echo %a%
%a%

C:\>echo %a%
3

C:\>set a=3&echo %a%
3

但是当我这样做时

C:\>set a=

C:\>set a=3&set

a=3 包含在列出的变量中!

我需要这个来获得我在这里学到的一个技巧,即使输出是管道的,也要获取命令的退出代码: Windows 命令解释器:如何获取第一个管道命令的退出代码, 但我必须在 make 脚本中使用它,这就是为什么一切必须在一条线上!这就是我想要做的:

target:
    ($(command) & call echo %%^^errorlevel%% ^>$(exitcodefile)) 2>&1 | tee $(logfile) & set /p errorlevel_make=<$(exitcodefile) & exit /B %errorlevel_make%

但errorlevel_make 始终为空(带有退出代码的文件存在并且包含正确的退出代码)。

这是cmd中的错误吗?有什么想法我能做什么?

4

3 回答 3

12

观察到行为的原因是命令行的处理方式。

在第一种情况下set a=3&echo %a%,当行在执行之前被解释时,所有变量都被替换为它们的值。a 在行执行之前没有任何值,因此不能在 echo 中替换它

在第二种情况下,set a=3&set执行前没有变量替换。因此,当执行 set 时, a 具有分配的值。

于 2013-10-23T15:57:06.850 回答
5

创建一个单独的批处理文件来解决这个问题要容易得多,因为即使对于专家来说也不明显。

但在你的情况下,这应该有效

target:
    ($(command) & call echo %^^^^errorlevel% >$(exitcodefile)) 2>&1 | tee $(logfile) & set /p errorlevel_make=<$(exitcodefile) & call exit /B %^errorlevel_make%

一个单独的批次可能看起来像

extBatch.bat

@echo off
("%~1" & call echo %%^^errorlevel%% > "%~2") 2>&1 | tee "%~3" & set /p errorlevel_make=<"%~2" 
exit /B %errorlevel_make%

然后你可以从你的make文件开始批处理

target:
    extBatch.bat $(command) $(exitcodefile) $(logfile)
于 2013-10-23T15:30:04.867 回答
0

受到 jeb 的好答案的启发,我稍微修改了代码,以便能够分别获取管道每一侧的错误级别。例如,您的批处理文件中有以下管道:

CD non_exisitng 2>&1 | FIND /V ""
ECHO Errorlevel @right: %errorlevel%

上面的错误级别仅指管道的右侧,它指示 FIND 命令是否成功。但是,为了能够得到双方的errorlevel,我们可以把上面的代码改成这样:

(CD non_exisitng & CALL ECHO %%^^errorlevel%% >err) 2>&1 | FIND /V ""
ECHO Errorlevel @right: %errorlevel%
SET /P err=<err
ECHO Errorlevel @left: %err%

输出:

The system cannot find the path specified.
errorlevel @right: 0
errorlevel @left: 1

@OP:

我意识到这有点晚了,但可能对其他人有帮助。除了jeb的外接批处理文件的方法,原来的问题也可以单行解决:

target:
    ($(command) & call echo %%^^errorlevel%% >$(exitcodefile)) 2>&1 | tee $(logfile) & set /p errorlevel_make=<$(exitcodefile)  & cmd /c call exit /B %%errorlevel_make%%
于 2014-11-27T17:58:18.057 回答