在PowerShell中,使用echo命令编写的文件不能与NodeJS一起使用

echo "console.log('Test success!')" > app.js

node app

在Linux上运行良好。 PowerShell,但是,会产生以下错误消息:

 ~\apps\test\app.js:1 (function (exports, require, module, __filename, __dirname) {   c ^ SyntaxError: Invalid or unexpected token at Object.exports.runInThisContext (vm.js:76:16) at Module._compile (module.js:528:28) at Object.Module._extensions..js (module.js:565:10) at Module.load (module.js:473:32) at tryModuleLoad (module.js:432:12) at Function.Module._load (module.js:424:3) at Module.runMain (module.js:590:10) at run (bootstrap_node.js:394:7) at startup (bootstrap_node.js:149:9) at bootstrap_node.js:509:3 

另一方面,如果我要echo > app.js ,则从文本编辑器inputconsole.log('Test success!')node app运行得很好。

怎么来的?

我最好的猜测:在PowerShell中,回声似乎使stringhex,而不是UTF-8。

PowerShell的>运算符总是生成UTF-16LE编码的文件 ,该node无法处理。

要创buildUTF-8编码的文件,请使用Out-FileSet-Content并使用-Encoding Utf8

 "console.log('Test success!')" | Set-Content -Encoding Utf8 app.js 

请注意,PowerShell在创buildUTF-8文件时总是会伪造一个伪BOM (前三个字节是hex字节值EF BB BF ),而UTF-8文件仅用于Windows世界,但node似乎能够处理这两个文件在Windows和类Unix平台上。

行为取决于您正在使用的shell。 在Windows中,如果您使用的是标准命令提示符cmd.exe,则引号本身将包含在内。 所以app.js将包含这个:

“console.log('testing成功!')”

删除引号将给出预期的结果。

echo console.log('Test success!')> app.js

请注意,如果你在PowerShell或者Linux上运行它,你将得到不同的结果,因为这些shell处理引号的方式不同。

Interesting Posts