相关疑难解决方法(0)

.bat文件中的奇怪范围问题

我正在写一个简单的.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,但这似乎并不那么干净.

是什么导致这种行为?代码块中的变量是否存在某种限制?

scope batch-file

17
推荐指数
1
解决办法
7038
查看次数

尊重msbuild调用的批处理文件中的退出代码

我有一个批处理文件,使用该exit命令返回退出代码.

在某些情况下,可以从命令行交互地调用此批处理文件,或者在其他情况下,可以使用该Exec任务作为MSBuild项目的一部分运行该批处理文件.

  • 如果我exit %errorlevel%在我的批处理文件中使用这很好,并且MSBuild看到错误代码,但是在这种情况下,从命令窗口运行批处理文件的交互式用户将获得cmd.exe的粗略退出.
  • 如果我使用exit /b %errorlevel%交互式场景没有得到粗鲁的退出,但这也意味着cmd我的Exec任务启动也没有退出,因此MSBuild没有看到返回值.

作为这两个问题的解决方案,我试图使用exit /b但是从我的构建脚本中启动批处理文件,如下所示:

<Exec Command="Batch.cmd params &amp; exit %errorlevel%" />
Run Code Online (Sandbox Code Playgroud)

这个想法是我明确地从'非终端'返回exit /b并手动调用exitcmd.exeExecBuild Task可以看到它之外传播这个值.

这似乎是完美的解决方案,但它不起作用.Exec仍然没有得到正确的错误值.

msbuild batch-file msbuild-task

8
推荐指数
1
解决办法
8744
查看次数

标签 统计

batch-file ×2

msbuild ×1

msbuild-task ×1

scope ×1