批量为什么要解释评论?

时间:2018-05-02 07:57:01

标签: batch-file

我有一个简单的批处理测试文件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.

为什么批量尝试解释评论?或者这里发生了什么?如果我取消注释,脚本会按预期打印出测试。

此外the documentation并未提及此事。

5 个答案:

答案 0 :(得分:2)

我认为这是解析序列的结果。在这种情况下,这是一个问题,但假设你编码(正如我所做的那样):

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

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

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

答案 1 :(得分:2)

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

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

字符串rem是无效的参数引用,因为既没有有效的修饰符,也没有这样的组合(%~fd,{{1 }},pnxsat)或后面的数字。

请参阅此主题:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

1 ... z扩展在我看来是错误的,因为$PATH:%%~,如果变量%VAR:=已定义,导致错误,如果未定义%VAR:*=VAR%VAR:[*]search=[replace]%等变量展开将中止(因此%VAR:~[position][,[length]]%会扩展为VAR%VAR:~%STR%设置为~text时。

答案 2 :(得分:1)

它并没有忽略它。

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

通过这样做,您将不会收到警告:

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

答案 3 :(得分:1)

为什么批量解释评论?

它不解释注释,但它必须解析行,这就是问题所在。

首先,解析器读取一行。

然后它展开所有百分比表达式,然后查看该行中的第一个标记 如果第一个标记是REM,那么剩余的东西将不再被解释(重定向,延迟扩展,管道,&符号,......都被忽略)

问题是,解析器首先扩展所有百分比表达式,当存在类似%~的表达式时,解析器会抛出错误消息。

答案 4 :(得分:0)

如果您不想修改注释代码,可以使用:

project_name = project_name = 'budget_service'
message = 'This is a test'
labels = {
    'deployment': 'develop',
    'severity': 'info'
}

# Import libs
from google.cloud import logging
import multiprocessing as mp

# Initialize logging
logging_client = logging.Client()
logger = logging_client.logger(project_name)

# Function to write log
def writeLog(logger):
    logger.log_text(
        text = message,
        labels = labels
    )
    print('logger succeeded')

def testFunction():
    print('test')

# Run without mp
writeLog(logger)

# Run with mp
print(__name__)
if __name__ == '__main__':       
    try:
        print('mp started')

        # Initialize
        manager = mp.Manager()
        return_dict = manager.dict()
        jobs = []

        # Set up workers
        worker_log1 = mp.Process(name='testFunction', target=testFunction, args=[])
        worker_log2 = mp.Process(name='writeLog', target=writeLog, args=[logger])

        # Store in jobs
        jobs.append(worker_log1)
        jobs.append(worker_log2)


        # Start workers
        worker_log1.start()
        worker_log2.start()

        for job in jobs:
            job.join()

        print('mp succeeded')

    except Exception as err:
         print(err)

虽然这有点难看,但它会避免解释REM %= IF "%~version_info" == "" echo No version information found

您可以在this answer

中批量查找有关评论的更多信息

至于为什么会这样,整批产品听起来有点破碎。