Nodejs脚本查找程序路径
Nodejs脚本查找程序路径
今天想更新node,但找不到node原本装在哪里= =!于是就有了这个脚本。可以查找应用程序安装目录。
通过运行$PATH/APPNAME -v来判断程序的exit code是否不为-1来判断程序是否存在。
#!/usr/bin/env node
var path = require('path'),
spawn = require('child_process').spawn;
// usage: whereis.js APPNAME
if (process.argv.length < 3 || process.argv.length >3) {
console.log(‘usage: whereis.js APPNAME’);
process.exit(1);
}
var paths = process.env.PATH.split(’:’);
var app = process.argv[2];
var finished = 0;
for(var i = 0; i < paths.length; i++) {
var cmd = path.join(paths[i], app);
var appRun = spawn(cmd, [’-v’]);
(function(path, appRun) {
appRun.on('close', function(code) {
if(code != -1) {
console.log('app path: %s', path);
process.exit(0);
}
finishOne();
});
appRun.on('error', function(error) {
});
})(paths[i], appRun);
}
function finishOne() {
finished++;
if (finished == paths.length) {
console.log(‘No such app’);
}
}
使用fs.exists判断
#!/usr/bin/env node
var path = require('path'),
fs = require('fs');
// usage: whereis.js APPNAME
if (process.argv.length < 3 || process.argv.length >3) {
console.log('usage: whereis.js APPNAME');
process.exit(1);
}
var paths = process.env.PATH.split(':');
var app = process.argv[2];
var finished = 0;
for(var i = 0; i < paths.length; i++) {
var fullPath = path.join(paths[i], app);
(function(path) {
fs.exists(fullPath, function(exists) {
if (exists) {
console.log('app path: %s', path);
process.exit(0);
}
finishOne();
});
})(fullPath);
}
function finishOne() {
finished++;
if (finished == paths.length) {
console.log('No such app');
}
}
Nodejs脚本查找程序路径
今天想更新node,但找不到node原本装在哪里= =!于是就有了这个脚本。可以查找应用程序安装目录。
通过运行 $PATH/APPNAME -v
来判断程序的 exit code
是否不为 -1
来判断程序是否存在。
#!/usr/bin/env node
const path = require('path');
const { spawn } = require('child_process').spawn;
// 使用方式: whereis.js APPNAME
if (process.argv.length < 3 || process.argv.length > 3) {
console.log('使用方式: whereis.js APPNAME');
process.exit(1);
}
const paths = process.env.PATH.split(':');
const app = process.argv[2];
let finished = 0;
for (let i = 0; i < paths.length; i++) {
const cmd = path.join(paths[i], app);
const appRun = spawn(cmd, ['-v']);
(function (path, appRun) {
appRun.on('close', function (code) {
if (code === 0) { // 假设退出码为0表示程序存在
console.log('app path: %s', path);
process.exit(0);
}
finishOne();
});
appRun.on('error', function (error) {
finishOne();
});
})(cmd, appRun);
}
function finishOne() {
finished++;
if (finished === paths.length) {
console.log('未找到该应用');
}
}
使用 fs.exists
判断文件是否存在
#!/usr/bin/env node
const path = require('path');
const fs = require('fs');
// 使用方式: whereis.js APPNAME
if (process.argv.length < 3 || process.argv.length > 3) {
console.log('使用方式: whereis.js APPNAME');
process.exit(1);
}
const paths = process.env.PATH.split(':');
const app = process.argv[2];
let finished = 0;
for (let i = 0; i < paths.length; i++) {
const fullPath = path.join(paths[i], app);
(function (fullPath) {
fs.exists(fullPath, function (exists) {
if (exists) {
console.log('app path: %s', fullPath);
process.exit(0);
}
finishOne();
});
})(fullPath);
}
function finishOne() {
finished++;
if (finished === paths.length) {
console.log('未找到该应用');
}
}
解释
-
使用
spawn
方法:- 通过尝试运行
APPNAME -v
来检查程序是否存在。 - 如果程序成功运行(假设退出码为
0
),则输出其路径并结束进程。 - 如果程序不存在或发生错误,则继续检查下一个路径。
- 通过尝试运行
-
使用
fs.exists
方法:- 直接检查每个可能的路径下是否存在指定的应用程序。
- 如果找到应用程序,则输出其路径并结束进程。
- 如果所有路径都检查完毕仍未找到,则输出未找到信息。
以上两种方法都可以用来查找应用程序的安装路径,选择哪种方法取决于你的具体需求和环境。
原来还可以 -v 判断 挺好
哪种快?
根据您提供的示例代码,您希望编写一个Node.js脚本来查找指定应用程序的安装路径。下面是基于fs.exists
方法的一个改进版本的代码,该方法更符合当前的最佳实践(使用fs.existsSync
),并且会更加准确地查找应用程序。
使用fs.existsSync
#!/usr/bin/env node
var path = require('path');
var fs = require('fs');
// usage: whereis.js APPNAME
if (process.argv.length < 3 || process.argv.length > 3) {
console.log('usage: whereis.js APPNAME');
process.exit(1);
}
var app = process.argv[2];
// 获取PATH环境变量中的所有路径
var paths = process.env.PATH.split(':');
for (var i = 0; i < paths.length; i++) {
var fullPath = path.join(paths[i], app);
if (fs.existsSync(fullPath)) {
console.log('app path: %s', fullPath);
process.exit(0);
}
}
console.log('No such app');
解释
- 获取命令行参数:首先检查是否有提供应用程序名称作为命令行参数。
- 分割PATH变量:将环境变量
PATH
中的路径用冒号分隔,并存储在一个数组中。 - 遍历路径:循环遍历每个路径,并尝试拼接出完整路径。
- 检查文件存在性:使用
fs.existsSync
检查完整路径下是否有该可执行文件。 - 输出结果:如果找到应用程序,则输出其路径并退出脚本;否则,在遍历完所有路径后输出未找到信息。
这种方法避免了不必要的进程创建和错误处理逻辑,使代码更简洁且易于理解。