当前位置: 首页 > 知识库问答 >
问题:

为什么批处理解释评论?

冯敏达
2023-03-14

我有一个简单的批处理测试文件test.bat如下行:

@echo off
REM IF "%~version_info" == "" echo No version information found
echo test

当我运行它时,我希望得到的是测试,而不是:

The following usage of the path operator in batch-parameter
substitution is invalid: %~version_info" == "" echo No version information found


For valid formats type CALL /? or FOR /?
The syntax of the command is incorrect.

为什么batch会试图解释这条评论?或者这里发生了什么?如果我去掉注释,脚本会按预期打印测试。

文件中也没有提到这一点。

共有3个答案

裴成文
2023-03-14

它没有忽视它。

在批处理文件中,您需要添加%%而不是%,因此它只是警告您替换无效。cmdline仍然读取注释行并看到您在其中有一个有效的命令,但方法不正确,它会警告您。

这样做,您将不会得到警告:

@echo off
REM IF "%%~version_info" == "" echo No version information found
echo test
窦涵忍
2023-03-14

原因是批处理脚本的顺序。

首先发生的是(差1%-符号处理,即正常变量(%VAR%)和命令行参数(%1%2等,以及%*)扩展。命令,甚至rem,都会在以后的解析阶段被识别。

字符串%~是无效的参数引用,因为既没有有效的修饰符,也没有这类修饰符的组合(fdpnxstz路径:),或后面的数字。

请参阅此线程:Windows命令解释器(CMD. EXE)如何解析脚本?

1...%扩展在我看来是错误的,因为%~%VAR:=%VAR:*=,如果变量VAR被定义,导致错误,并且变量扩展如%VAR:[*]search=[替换]%%VAR:~[位置][,[长度]]%VAR未定义的情况下中止(因此%VAR:~%STR%STR设置为text时扩展为~text)。

商鸿哲
2023-03-14

我相信这是解析序列的结果。在这种情况下,这是一个问题,但假设您编码(就像我所做的那样):

set "debug=rem"
%debug% echo some debug data

首先,我们替换%vars%中的值,然后我们解释该行,使用第一个标记作为要执行的命令。上面的构造允许更改命令。

所以有一个疯狂的方法...

 类似资料:
  • 问题内容: 我知道使用执行程序而不是ThreadGroup的当前做法: 通常首选的处理线程的方法 从线程等捕获异常… 但是,这样 的ThreadGroup 固有的 缺陷是 什么(我听过对该类的模糊批评)? 感谢您的回答。 PS。这似乎无法回答这个问题。 问题答案: 这在《有效的Java第二版》中进行了解释。,项目73。 最初将线程组设想为一种出于安全目的隔离小程序的机制。他们从来没有真正兑现过这个

  • 主要内容:使用Rem语句注释,注释使用::声明为创建的脚本添加注释或文档总是一个好习惯。 这是一个维护脚本用来理解脚本实际所做的事情所必需的注释。 例如,考虑下面这段没有注释形式的代码。 如果一个没有任何注释的脚本,普通人试图理解脚本,那么需要很多时间来理解脚本做些什么工作。 使用Rem语句注释 有两种方法可以在批处理脚本中创建注释; 一个是通过命令。 语句后的任何文本都将被视为注释,不会被执行。 以下是此声明的一般语法。 语法 其中是需要添

  • 问了这个问题后,我很困惑,于是决定为一个C编译器程序构建类似的测试。这是我的代码: 使用选项在GCC下编译 测试代码被更改,这样错误值只能在运行时知道(而不能在编译时知道),这样GCC优化器就不能删除循环的代码。 我们应该期待CPU的加速吗?(正如GCC编译程序预测的那样)

  • 问题内容: 我是hibernate的新手,我对hibernate批处理有疑问,我读了一些有关hibernate批处理的教程,他们说 Hibernate将所有持久化的对象缓存在会话级缓存中,最终您的应用程序将在第50,000行附近出现OutOfMemoryException崩溃。如果您将批处理与Hibernate一起使用,则可以解决此问题, 我的疑问是不是要在外部初始化会话,为什么我们不能将其初始化

  • 问题内容: 我有2个文件夹,每个文件夹包含数十个批处理文件()。 批处理文件包含类似于以下内容的文本 要么 在Java中,我列出了每个文件夹中的每个批处理,并循环浏览列表,执行每个批处理文件,如下所示: 方法返回后,删除批处理文件。 问题是,批处理文件中的所有命令均未运行(我请求删除或删除的文件和文件夹均未运行),并且Java进程只是继续并删除了批处理文件本身。 批处理文件位于文件夹中 写下来之后

  • 这当然会产生错误。 (顺便说一句:在文件中没有。)