我正在写一个简单的.bat文件,我遇到了一些奇怪的行为.有几个地方我必须做一个简单的if/else,但块内的代码似乎没有正常工作.
这是一个演示错误的简单案例:
@echo off
set MODE=FOOBAR
if "%~1"=="" (
set MODE=all
echo mode: %MODE%
) else (
set MODE=%~1
echo mode: %MODE%
)
echo mode: %MODE%
Run Code Online (Sandbox Code Playgroud)
我得到的输出是:
C:\>test.bat test
mode: FOOBAR
mode: test
Run Code Online (Sandbox Code Playgroud)
为什么代码块中的回声没有得到变量的新值?在我写的实际代码中,我需要构建一些变量并在if/else的范围内引用它们.我可以将其切换为使用标签和gotos而不是if/else,但这似乎并不那么干净.
是什么导致这种行为?代码块中的变量是否存在某种限制?
我有一个批处理文件,使用该exit命令返回退出代码.
在某些情况下,可以从命令行交互地调用此批处理文件,或者在其他情况下,可以使用该Exec任务作为MSBuild项目的一部分运行该批处理文件.
exit %errorlevel%在我的批处理文件中使用这很好,并且MSBuild看到错误代码,但是在这种情况下,从命令窗口运行批处理文件的交互式用户将获得cmd.exe的粗略退出.exit /b %errorlevel%交互式场景没有得到粗鲁的退出,但这也意味着cmd我的Exec任务启动也没有退出,因此MSBuild没有看到返回值.作为这两个问题的解决方案,我试图使用exit /b但是从我的构建脚本中启动批处理文件,如下所示:
<Exec Command="Batch.cmd params & exit %errorlevel%" />
Run Code Online (Sandbox Code Playgroud)
这个想法是我明确地从'非终端'返回exit /b并手动调用exit以cmd.exe在ExecBuild Task可以看到它之外传播这个值.
这似乎是完美的解决方案,但它不起作用.Exec仍然没有得到正确的错误值.