我有一个简单的批处理测试文件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并未提及此事。
答案 0 :(得分:2)
我认为这是解析序列的结果。在这种情况下,这是一个问题,但假设你编码(正如我所做的那样):
set "debug=rem"
%debug% echo some debug data
首先,我们替换%vars%
中的值,然后我们解释该行,使用第一个标记作为要执行的命令。上述结构允许改变命令。
所以有一种疯狂的方法......
答案 1 :(得分:2)
原因是批处理脚本的顺序。
首先发生的是(差 1 )%
- 符号处理,即正常变量(%VAR%
)和命令行参数({ {1}},%1
等,以及%2
)扩展。命令,甚至%*
,在稍后的解析阶段中被识别。
字符串rem
是无效的参数引用,因为既没有有效的修饰符,也没有这样的组合(%~
,f
,d
,{{1 }},p
,n
,x
,s
,a
,t
)或后面的数字。
请参阅此主题: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
中批量查找有关评论的更多信息至于为什么会这样,整批产品听起来有点破碎。