首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >%~ in REM语句

%~ in REM语句
EN

Stack Overflow用户
提问于 2017-06-14 08:55:36
回答 3查看 1.5K关注 0票数 6

我注意到在一个windows批处理文件中,即使您运行了一个%~,也会得到错误

代码语言:javascript
复制
For valid formats type CALL /? or FOR /?
The syntax of the command is incorrect.

为什么注释行没有被忽略?

代码语言:javascript
复制
@ ECHO OFF
REM Blah blah blah
REM %~ this will cause an error
REM %%~ Double the fun, no error
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-14 09:08:39

REM是一个类似于ECHO的命令。在命令提示符窗口rem /?中运行以获得有关此命令的帮助。

Windows命令解释器首先像批处理文件中的所有其他行一样解析此命令行,但以冒号开头的行除外,这些行被解释为label行,而不是命令行。

因此,在执行%之前,单个被解释为环境变量或批处理文件参数引用的开始。由于此命令行中不再有百分比符号,因此删除了单个百分比符号。

%~在命令行解析中被解释为无效的批处理文件参数引用。对于命令解释器来说,命令不计算行的其余部分并不重要。首先,命令行是独立于命令进行解析的,接下来,无论命令是什么,命令都由cmd.exe执行。

删除第一行@ ECHO OFF,可以看到每个命令行是如何在被Windows命令解释器解析后执行的。以冒号开头的行不会输出为被解释为标签行而不是命令行。

有关批处理脚本解析的详细信息,请参阅How does the Windows Command Interpreter (CMD.EXE) parse scripts?

示例:

代码语言:javascript
复制
REM User name: %USERNAME%
REM User profile directory: %USERPROFILE%
REM Application data directory: %APPDATA%
REM Batch arguments: %0 %*
PAUSE

在这些、REM、命令行中,环境变量引用和批处理文件参数引用被环境变量和批处理文件参数的值替换。

票数 5
EN

Stack Overflow用户

发布于 2017-06-14 09:08:26

(最初)发布的代码不会导致错误。但这将:

代码语言:javascript
复制
REM %~ this will cause an error

原因是,参数展开比注释具有更高的优先级,cmd.exe将首先尝试展开和删除此处未给出的参数,%~

票数 4
EN

Stack Overflow用户

发布于 2022-10-05 17:10:57

避免扩展REM语句参数的最佳方法是使用goto跳过它们。就像这样:

代码语言:javascript
复制
    goto :afterREMS
    REM following line with crash/exit the BAT script if processed
    REM     %~I         - expands %I removing any surrounding quotes (")
    :afterREMS

编程已经有一段时间了,今天是我第一次被这个问题所困扰。我认为在我的BAT中记录所有不同的宏展开是很方便的,但是我遇到了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44540037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档