我有一个简单的批处理测试文件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会试图解释这条评论?或者这里发生了什么?如果我去掉注释,脚本会按预期打印测试。
文件中也没有提到这一点。
它没有忽视它。
在批处理文件中,您需要添加%%
而不是%
,因此它只是警告您替换无效。cmdline仍然读取注释行并看到您在其中有一个有效的命令,但方法不正确,它会警告您。
这样做,您将不会得到警告:
@echo off
REM IF "%%~version_info" == "" echo No version information found
echo test
原因是批处理脚本的顺序。
首先发生的是(差1)%
-符号处理,即正常变量(%VAR%
)和命令行参数(%1
、%2
等,以及%*
)扩展。命令,甚至rem
,都会在以后的解析阶段被识别。
字符串%~
是无效的参数引用,因为既没有有效的修饰符,也没有这类修饰符的组合(f
,d
,p
,n
,x
,s
,t
,z
,路径:
),或后面的数字。
请参阅此线程:Windows命令解释器(CMD. EXE)如何解析脚本?
1...%
扩展在我看来是错误的,因为%~
或%VAR:=
,%VAR:*=
,如果变量VAR
被定义,导致错误,并且变量扩展如%VAR:[*]search=[替换]%
或%VAR:~[位置][,[长度]]%
在VAR
未定义的情况下中止(因此%VAR:~%STR%
当STR
设置为text
时扩展为~text
)。
我相信这是解析序列的结果。在这种情况下,这是一个问题,但假设您编码(就像我所做的那样):
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进程只是继续并删除了批处理文件本身。 批处理文件位于文件夹中 写下来之后
这当然会产生错误。 (顺便说一句:在文件中没有。)