在我的 Node.js 项目中,我定义了一个脚本:
{
"scripts": {
"fix:formatting-translation": "ts-node -O '{\"module\": \"commonjs\"}' tools/sortTranslation.ts"
}
}
这可以在 Linux 下工作,但是在 Windows(使用命令 shell)下,我会收到以下错误:
undefined:1
'{module:
^
SyntaxError: Unexpected token ''', "'{module:" is not valid JSON
因此,'
会导致错误。此外,错误消息表明module
不再引用。用\"
(如此处远程建议的)替换它们也不起作用:
undefined:1
{module: commonjs}
^
SyntaxError: Expected property name or '}' in JSON at position 1
但它可能是朝着正确方向迈出的一步,因为 - 据我所知 - 现在它正在抱怨未引用的module
。
我如何才能ts-node
正确地将此 JSON 对象传递给?有没有办法使用 ASCII 序列而不是?理想情况下,该解决方案也"
适用于。bash
在Windows上可以使用:
该字符在 JSON 字符串中必须进行转义,这就是必须写为和的
"
原因。"module"
\"module\"
"commonjs"
\"commonjs\"
Linux/Mac 上的 shell 解释器(例如)
bash
支持多种引用字符串的方式,以将其作为参数传递给可执行文件。 中的参数字符串'
按字面意思解释,无需扩展变量引用、进行 shell 参数扩展或将反斜杠解释为转义字符。'
因此,括在 中的字符串不能包含字符'
,即使前面带有反斜杠也不行,因为反斜杠按字面意思解释,而后面的内容'
则解释为 中括起来的参数字符串的结尾'
。Windows 命令处理器 仅
cmd.exe
支持一种引用参数字符串的方式。括在 中的参数字符串"
将按字面意思解释,但有两个例外:%
双引号参数字符串内的被解释为环境/动态变量引用的开始/结束,或FOR循环内的循环变量引用,或处理批处理文件时的批处理文件参数引用。!
在启用延迟变量扩展时,双引号参数字符串内的参数被解释为环境/动态变量引用的开始/结束。无法定义一个括在 中的参数字符串,
"
用于逐字解释空格和其他 ASCII 字符,这些字符对于包含自身的上下文cmd
具有特殊含义。无法在双引号参数字符串中转义双引号。&(){}^=;!'+,`~<>|
"
该字符
'
不能用来将字符串作为参数字符串引用,因为cmd
在这种情况下将它们解释为文字字符并将两者'
进一步传递给可执行文件。这些是 JSON 数据的主要问题,应将其作为一个参数字符串传递给可执行文件,因为 JSON 格式的数据中的字符串必须括在内
"
,但无法用'
引用cmd.exe
。解决方案是使用反斜杠对 JSON 数据的每个双引号字符进行转义。在这种情况下,有必要使用另一个反斜杠对每个转义反斜杠进行转义,因为最终传递给的字符串
ts-node
本身是在 JSON 格式中定义的,在该格式中,解析反斜杠字符将被解释为转义字符,转义反斜杠之后除外。ts-node
因此,解决方案是在 JSON 格式的数据块内传递 JSON 数据的定义,并\\\"
为 JSON 数据字符串中的每个双引号添加引号。但还有一个问题需要解决。
ts-node
将传递给它的命令行字符串拆分为空格作为参数字符串分隔符(如果未括在引号中)。因此,无法使用:冒号后的空格字符
ts-node
最终将命令行解释为以下一系列参数:-O
{"module":
"commonjs"}
tools/sortTranslation.ts
这当然是不正确的,因为第二个参数字符串不再是有效的jsoncompilerOption。
但冒号后面的空格只是为了提高可读性。JSON 格式本身并不要求冒号后面必须有空格,而空格必须位于名称和值之间。这里可以省略它,这样就解决了问题。
解决方案是:
ts-node
现在最终将命令行字符串解释为一系列以下参数字符串:-O
{"module":"commonjs"}
tools/sortTranslation.ts