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');
	}
}


截图


4 回复

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('未找到该应用');
    }
}

解释

  1. 使用 spawn 方法

    • 通过尝试运行 APPNAME -v 来检查程序是否存在。
    • 如果程序成功运行(假设退出码为 0),则输出其路径并结束进程。
    • 如果程序不存在或发生错误,则继续检查下一个路径。
  2. 使用 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');

解释

  1. 获取命令行参数:首先检查是否有提供应用程序名称作为命令行参数。
  2. 分割PATH变量:将环境变量PATH中的路径用冒号分隔,并存储在一个数组中。
  3. 遍历路径:循环遍历每个路径,并尝试拼接出完整路径。
  4. 检查文件存在性:使用fs.existsSync检查完整路径下是否有该可执行文件。
  5. 输出结果:如果找到应用程序,则输出其路径并退出脚本;否则,在遍历完所有路径后输出未找到信息。

这种方法避免了不必要的进程创建和错误处理逻辑,使代码更简洁且易于理解。

回到顶部