java调用node脚本并获取输出_如何使用Node.js获取当前脚本的路径?

回答(13)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

Node.js 10支持ECMAScript modules,其中 __dirname 和 __filename 不可用 .

然后要获得当前ES模块的路径,必须使用:

const __filename = new URL(import.meta.url).pathname;

对于包含当前模块的目录:

import path from 'path';

const __dirname = path.dirname(new URL(import.meta.url).pathname);

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

Use __dirname!!

__dirname

当前模块的目录名称 . 这与 __filename 的path.dirname()相同 .

示例:从/ Users / mjr运行节点example.js

console.log(__dirname);

// Prints: /Users/mjr

console.log(path.dirname(__filename));

// Prints: /Users/mjr

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

此命令返回当前目录:

var currentPath = process.cwd();

例如,要使用路径来读取文件:

var fs = require('fs');

fs.readFile(process.cwd() + "\\text.txt", function(err, data)

{

if(err)

console.log(err)

else

console.log(data.toString());

});

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我再次查看文档后找到了它 . 我在寻找的是__filename和__dirname模块级变量 .

__filename 是当前模块的文件名 . 这是当前模块文件的已解析绝对路径 . (例如: /home/kyle/some/dir/file.js )

__dirname 是当前模块的目录名称 . (例如: /home/kyle/some/dir )

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

另一种方法,如果你想找到调用这样的子模块或你正在运行的任何模块的主模块的 filename ,就是使用它

var fnArr = (process.mainModule.filename).split('/');

var filename = fnArr[fnArr.length -1];

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

var settings =

JSON.parse(

require('fs').readFileSync(

require('path').resolve(

__dirname,

'settings.json'),

'utf8'));

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

您可以使用process.env.PWD获取当前的应用程序文件夹路径 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如果你想在shell脚本中更像$ 0,试试这个:

var path = require('path');

var command = getCurrentScriptPath();

console.log(`Usage: ${command} `);

function getCurrentScriptPath () {

// Relative path from current working directory to the location of this script

var pathToScript = path.relative(process.cwd(), __filename);

// Check if current working dir is the same as the script

if (process.cwd() === __dirname) {

// E.g. "./foobar.js"

return '.' + path.sep + pathToScript;

} else {

// E.g. "foo/bar/baz.js"

return pathToScript;

}

}

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

所以基本上你可以这样做:

fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);

使用resolve()而不是与'/'或''连接,否则您将遇到跨平台问题 .

注意:__ dirname是模块或包含脚本的本地路径 . 如果您正在编写一个需要知道主脚本路径的插件,那就是:

require.main.filename

或者,只是获取文件夹名称:

require('path').dirname(require.main.filename)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

每个Node.js程序在其环境中都有一些全局变量,它代表有关您的进程的一些信息,其中一个是 __dirname .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

说到主脚本,它很简单:

process.argv[1]

process.argv包含命令行参数的数组 . 第一个元素是'node',第二个元素是JavaScript文件的路径 . 下一个元素将是任何其他命令行参数 .

如果您需要知道模块文件的路径,请使用__filename .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我知道这是相当陈旧的,我回复的原始问题被标记为重复并指示在这里,但我遇到了一个问题,试图让jasmine-reporter工作,并且没有正确地解析savePath并且实际上是报告jasmine-reporter目录中的文件夹输出,而不是我运行gulp的根目录 . 为了使这项工作正常,我最终使用 process.env.INIT_CWD 来获取最初的当前工作目录,该目录应该是您运行gulp的目录 . 希望这有助于某人 .

var reporters = require('jasmine-reporters');

var junitReporter = new reporters.JUnitXmlReporter({

savePath: process.env.INIT_CWD + '/report/e2e/',

consolidateAll: true,

captureStdout: true

});

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

如果您使用 pkg 打包您的应用程序,您会发现这个表达式很有用:

appDirectory = require('path').dirname(process.pkg ? process.execPath : (require.main ? require.main.filename : process.argv[0]));

process.pkg 告诉应用程序是否已被 pkg 打包 .

process.execPath 包含可执行文件的完整路径,对于脚本( node test.js )的直接调用或打包的应用程序,它是 /usr/bin/node 或类似的 .

require.main.filename 保存主脚本的完整路径,但是当Node以交互模式运行时它是空的 .

__dirname 保存当前脚本的完整路径,所以我没有使用它(虽然它可能是OP要求的;然后更好地使用 appDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0])); 注意在交互模式 __dirname 是空的 .

对于交互模式,使用 process.argv[0] 获取节点可执行文件的路径,或使用 process.cwd() 获取当前目录 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值