-print 通过 npm 打印出字符串,但实际上通过 powershell 进行评估

Posted

技术标签:

【中文标题】-print 通过 npm 打印出字符串,但实际上通过 powershell 进行评估【英文标题】:-print printing out string via npm but actually evaluating through powershell 【发布时间】:2019-04-11 14:37:25 【问题描述】:

我的 package.json 中定义了以下脚本:

    "abc": "node -p 'p=require(\"./package\");p.main=\"lib\";p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)'",

如果我运行 'npm run-script abc' 我最终会得到一个带有字符串的 package.json

'p=require(\"./package\");p.main=\"lib\";p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)'

如果我运行命令:

node -p 'p=require(\"./package\");p.main=\"lib\";p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)'

直接在 powershell 中我实际上得到了我正在寻找的 json 输出。

不知道为什么会有差异?我也试过用 -e/-eval 也无济于事,似乎认为它只是打印出脚本?

【问题讨论】:

【参考方案1】:

将您的 npm 脚本改为以下内容:

"abc": "node -p \"p=require('./package');p.main='lib';p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)\"",

您的 npm 脚本现在将通过 Powershell命令提示符 (cmd.exe)LinuxMacOS。

变化如下:

node/js 代码已被包裹在 JSON 转义双引号 \"...\" 而不是单引号中。

实际的 node/js 代码本身使用单引号 '...' 而不是 JSON 转义双引号 \"...\",因为在 javascript 中使用转义双引号是无效的语法。

"abc": "node -p \"p=require('./package');p.main='lib';p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)\"",
                ^^          ^         ^         ^   ^                                                               ^^

【讨论】:

【参考方案2】:

这是一个引用问题。

问题是运行npm run-script abc 不是在powershell 中解释(正确支持单引号和双引号),而是在cmd 中。

您可以:

用双引号代替单引号,并使用适当的转义(虽然结果可能有点难看):

"abc": "node -p \"p=require(\\\"./package\\\");p.main=\\\"lib\\\";p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)\""

在 javascript 代码中使用单引号并在脚本中使用双引号

"abc": "node -p \"p=require('./package');p.main='lib';p.scripts=p.devDependencies=undefined;JSON.stringify(p,null,2)\""

【讨论】:

以上是关于-print 通过 npm 打印出字符串,但实际上通过 powershell 进行评估的主要内容,如果未能解决你的问题,请参考以下文章

在二叉搜索树程序 Codeblock 正在打印奇怪的字符

查找并打印出字符串中特定字符的出现次数 (shell/AIX)

手机调试Android程序出异常时不打印堆栈信息

从 javascript 触发 base64 编码 PDF 的打印预览

为啥以文本形式打开图像文件会打印出奇怪的字符?

在换行符后从文件中打印出字符串